Odpověď závisí na vašich požadavcích na výsledek. Požadujete výsledek s konzistentní sadou sloupců bez ohledu na uživatelská práva? Pokud ano, můžete nastavit nepovolené hodnoty na null (nebo nějakou jinou speciální hodnotu) pomocí klauzule IF, např.
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 = '#'
Problémem samozřejmě může být „zvláštní hodnota“, protože potřebujete hodnotu, která by se v datech nikdy neobjevila. Pokud jste potřebovali znát rozdíl mezi hodnotou null, protože skutečná hodnota je null vs. null, protože jde o zakázaný sloupec, nemůžete použít hodnotu null.
Jiný přístup by vám umožnil jednoduše zahrnout do výsledku indikátor oprávnění pro každý sloupec a nechat vaši obchodní logiku, aby to použila k určení, které hodnoty jsou viditelné pro uživatele.
Velmi odlišný přístup by měl sadu výsledků obsahovat pouze povolené sloupce. V tomto případě budete muset vytvořit příkaz SQL dynamicky. Nevím, jestli to děláte v uložené proceduře nebo v hostitelském jazyce, ale základní myšlenka je něco takového:
string sqlCmd = "SELECT "
+ (SELECT (FIELDS_NAME_QUERY(UserID='#')
FROM USER_PRIVILEGES
WHERE userid='#')
+ FROM data d
execute sqlCmd
"execute" znamená cokoli, co máte k dispozici ke spuštění řetězce jako příkaz SQL.
více po upřesnění OP:
Dobře, potřebujete funkci sql, která vrátí řetězec, který vypadá jako "sloupec1, název2, ...". Následující se podobá tomu, jak by to vypadalo na serveru SQL. syntaxe
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