Ответ зависит от ваших требований к результату.Требуется ли результат с согласованным набором столбцов, независимо от привилегий пользователя?Если это так, вы можете установить недопустимые значения в 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<br>
FIELDS_NAME_QUERY (@userid int)<br>
begin<br>
select col1, col2, col3... INTO @col1priv, @col2priv, @col3priv FROM userPrivileges WHERE UserId = @UserId<br>
declare @result varhcar(60)<br>
set @result = ''<br>
if (@col1priv = 1) @result = 'col1'<br>
if (@col2priv = 1) @result = @result + ' ,col2'<br>
if (@col3priv = 1) @result = @result + ' ,col3'<br>
return @result<br>
end