Отговорът зависи от вашите изисквания към резултата. Имате ли нужда от резултат с последователен набор от колони, независимо от правата на потребителя? Ако е така, можете да зададете непозволените стойности на null (или някаква друга специална стойност), като използвате клауза IF, например,
SELECT IF (p.col1 = 0 THEN NULL ELSE d.col1) AS col1,
IF (p.col2 = 0 THEN NULL ELSE d.col2) AS col2,
IF (p.col3 = 0 THEN NULL ELSE d.col3) AS col3
FROM Data d,
UserPrivileges p
WHERE p.userId = '#'
AND d.DataId = '#'
Разбира се, „специалната стойност“ може да е проблем, тъй като имате нужда от стойност, която никога няма да се появи в данните. Ако трябва да знаете тази разлика между нула, защото реалната стойност е нула срещу нула, защото е забранена колона, тогава не можете да използвате нула.
Друг подход би бил просто да включите индикатора за привилегии за всяка колона, която се появява в резултата, и да оставите вашата бизнес логика да използва това, за да определи кои стойности са видими за потребителя.
Много различен подход би накарал наборът от резултати да съдържа само разрешените колони. В този случай ще трябва да изградите своя sql оператор динамично. Не знам дали правите това в съхранена процедура или на хост език, но основната идея е нещо подобно:
string sqlCmd = "SELECT "
+ (SELECT (FIELDS_NAME_QUERY(UserID='#')
FROM USER_PRIVILEGES
WHERE userid='#')
+ FROM data d
execute sqlCmd
"изпълни" означава всичко, което имате на разположение, за да изпълните низ като sql команда.
повече след пояснение от OP:
Добре, имате нужда от sql функция, която връща низ, който изглежда като "colname1, colname2, ...". Следното прилича на това, което би изглеждало в sql сървър. синтаксис
create function
FIELDS_NAME_QUERY (@userid int)
begin
select col1, col2, col3... INTO @col1priv, @col2priv, @col3priv FROM userPrivileges WHERE UserId = @UserId
declare @result varhcar(60)
set @result = ''
if (@col1priv = 1) @result = 'col1'
if (@col2priv = 1) @result = @result + ' ,col2'
if (@col3priv = 1) @result = @result + ' ,col3'
return @result
end