Het antwoord hangt af van uw vereisten voor het resultaat. Heeft u een resultaat nodig met een consistente set kolommen, ongeacht de gebruikersrechten? Als dat het geval is, kunt u de niet-toegestane waarden instellen op null (of een andere speciale waarde) met behulp van een IF-clausule, bijvoorbeeld
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 = '#'
Natuurlijk kan de "speciale waarde" een probleem zijn, omdat je een waarde nodig hebt die nooit in de gegevens zou verschijnen. Als u dat verschil tussen een null moet weten omdat de echte waarde null is versus null omdat het een verboden kolom is, kunt u null niet gebruiken.
Een andere benadering is dat u eenvoudig de privilege-indicator voor elke kolom in het resultaat opneemt en uw bedrijfslogica die laat gebruiken om te bepalen welke waarden zichtbaar zijn voor de gebruiker.
Een heel andere benadering zou zijn dat het resultaat alleen de toegestane kolommen bevat. In dit geval moet u uw SQL-instructie dynamisch opbouwen. Ik weet niet of je dit doet in een opgeslagen procedure of in een hosttaal, maar het basisidee is ongeveer als volgt:
string sqlCmd = "SELECT "
+ (SELECT (FIELDS_NAME_QUERY(UserID='#')
FROM USER_PRIVILEGES
WHERE userid='#')
+ FROM data d
execute sqlCmd
"execute" betekent alles wat je beschikbaar hebt om een string uit te voeren als een sql-opdracht.
meer na verduidelijking door OP:
Ok, je hebt een sql-functie nodig die een tekenreeks retourneert die eruitziet als "colname1, colname2, ...". Het volgende lijkt op hoe het eruit zou zien in sql-server. syntaxis
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