答えは、結果に対する要件によって異なります。ユーザーの権限に関係なく、一貫した列のセットを使用した結果が必要ですか?その場合、IF句を使用して、許可されていない値をnull(またはその他の特別な値)に設定できます(例:
)。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 = '#'
もちろん、データに表示されない値が必要になるため、「特別な値」が問題になる可能性があります。実際の値がnullであるためのnullと、禁止されている列であるためのnullの違いを知る必要がある場合は、nullを使用できません。
別のアプローチでは、結果に表示される各列の特権インジケーターを単純に含め、それをビジネスロジックに使用させて、ユーザーに表示される値を決定します。
非常に異なるアプローチでは、許可された列のみを含むように結果セットが作成されます。この場合、SQLステートメントを動的に作成する必要があります。これをストアドプロシージャで実行しているのか、ホスト言語で実行しているのかはわかりませんが、基本的な考え方は次のようになります。
string sqlCmd = "SELECT "
+ (SELECT (FIELDS_NAME_QUERY(UserID='#')
FROM USER_PRIVILEGES
WHERE userid='#')
+ FROM data d
execute sqlCmd
「実行」とは、SQLコマンドとして文字列を実行するために使用できるものを意味します。
OPによる説明後の詳細:
わかりました。「colname1、colname2、...」のような文字列を返すSQL関数が必要です。以下は、SQLサーバーでの表示に似ています。構文
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