Odpowiedź zależy od Twoich wymagań dotyczących wyniku. Czy potrzebujesz wyniku ze spójnym zestawem kolumn, niezależnie od uprawnień użytkownika? Jeśli tak, możesz ustawić niedozwolone wartości na null (lub inną specjalną wartość) za pomocą klauzuli IF, np.
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 = '#'
Oczywiście „wartość specjalna” może stanowić problem, ponieważ potrzebujesz wartości, która nigdy nie pojawiłaby się w danych. Jeśli musisz znać różnicę między wartością null, ponieważ rzeczywista wartość to null i null, ponieważ jest to zabroniona kolumna, nie możesz użyć wartości null.
Inne podejście wymagałoby prostego włączenia wskaźnika uprawnień dla każdej kolumny wyświetlanej w wyniku i umożliwienia logice biznesowej wykorzystania tego w celu określenia, które wartości są widoczne dla użytkownika.
W zupełnie innym podejściu zestaw wyników zawierałby tylko dozwolone kolumny. W takim przypadku będziesz musiał dynamicznie zbudować instrukcję sql. Nie wiem, czy robisz to w procedurze składowanej, czy w języku hosta, ale podstawowa idea jest mniej więcej taka:
string sqlCmd = "SELECT "
+ (SELECT (FIELDS_NAME_QUERY(UserID='#')
FROM USER_PRIVILEGES
WHERE userid='#')
+ FROM data d
execute sqlCmd
"wykonaj" oznacza wszystko, co masz dostępne do wykonania ciągu jako polecenia sql.
więcej po wyjaśnieniu przez OP:
Ok, potrzebujesz funkcji sql, która zwraca ciąg, który wygląda jak "nazwa_kolumny1, nazwa_kolumny2, ...". Poniżej przypomina to, jak wyglądałby na serwerze sql. składnia
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