Svaret beror på dina krav på resultatet. Behöver du ett resultat med en konsekvent uppsättning kolumner, oavsett användarprivat? Om så är fallet kan du ställa in de otillåtna värdena till null (eller något annat specialvärde) med hjälp av en IF-sats, t.ex.
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 = '#'
Naturligtvis kan det "särskilda värdet" vara ett problem, eftersom du behöver ett värde som aldrig skulle visas i data. Om du behövde veta skillnaden mellan en null eftersom det verkliga värdet är null vs. null eftersom det är en förbjuden kolumn så kan du inte använda null.
Ett annat tillvägagångssätt skulle få dig att enkelt inkludera privilegieindikatorn för varje kolumn som visas i resultatet, och låt din affärslogik använda den för att avgöra vilka värden som är synliga för användaren.
Ett helt annat tillvägagångssätt skulle få resultatet att bara innehålla de tillåtna kolumnerna. I det här fallet måste du bygga din sql-sats dynamiskt. Jag vet inte om du gör detta i en lagrad procedur eller på ett värdspråk, men grundidén är ungefär så här:
string sqlCmd = "SELECT "
+ (SELECT (FIELDS_NAME_QUERY(UserID='#')
FROM USER_PRIVILEGES
WHERE userid='#')
+ FROM data d
execute sqlCmd
"exekvera" betyder vad du än har tillgängligt för att köra en sträng som ett SQL-kommando.
mer efter klargörande av OP:
Ok, du behöver sql-funktion som returnerar en sträng som ser ut som "kolnamn1, kolnamn2, ...". Följande liknar hur det skulle se ut i sql-servern. syntax
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