クライアントから、レポート目的でいくつかのビューを実装するように依頼されました。ビューには、PowerBI、Excel、およびSSRSからアクセスします。指定されたユーザーは、ビューへのアクセス権のみを持ち、ユーザーが使用できる基になるテーブルがあってはなりません。
ビュー内のSQLが3つの異なるスキーマ(すべて同じデータベース内)に触れるという点で私が遭遇した問題:
ビューは次のとおりです。
CREATE VIEW dbo.vTestPermissions
AS
SELECT a.Column1,
b.Column1,
c.Column1
FROM Pupil.Table1 a
JOIN Provider.Table2 b ON a.Column1 = b.Column1
JOIN Security.Table3 c ON a.Column1 = c.Column1
テーブル/ビューの所有者は次のとおりです。
ビューから選択すると、エラーが発生します。
SELECT権限がオブジェクト 'table3'、データベース 'TEST'、スキーマ 'Security'で拒否されました
スキーマとテーブルにSELECT
オプションを付けて、または付けずにGRANT
権限を与えようとしましたが、これにより、基になるテーブルをユーザーが使用できるようになります。
これに関するどんな助けでも大歓迎です。
ビューとテーブルの所有者がすべて同じ場合は、ビューに対する選択権限を付与するだけで十分です。これは Ownership Chaining と呼ばれます:
チェーンを介してオブジェクトにアクセスすると、SQL Serverは最初にオブジェクトの所有者と呼び出し元オブジェクトの所有者を比較します。これはチェーンの前のリンクです。両方のオブジェクトの所有者が同じである場合、参照されるオブジェクトに対する権限は評価されません。
オブジェクトの所有者が異なる場合、所有権の連鎖は機能しません。
したがって、simplest答えは、ビューと一致するようにテーブルの所有権を変更することです。
ALTER AUTHORIZATION ON Pupil.Table1 TO dbo;
ALTER AUTHORIZATION ON Provider.Table2 TO dbo;
ALTER AUTHORIZATION ON Security.Table3 TO dbo;
ビューでの選択の許可:
GRANT SELECT ON dbo.vTestPermissions TO USER = 'your_user';
...その後、所有権の連鎖を介してビューからのアクセスを許可し、テーブルへの直接アクセスを防止します。
それがお客様のニーズに適さない場合は、より複雑な構成を検討する必要があります。