web-dev-qa-db-ja.com

同じデータベース内の複数のスキーマにわたる権限を選択する

クライアントから、レポート目的でいくつかのビューを実装するように依頼されました。ビューには、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

テーブル/ビューの所有者は次のとおりです。

  • Pupil.Table1-オーナーPupil
  • Provider.Table2-所有者プロバイダー
  • Security.Table3-所有者のセキュリティ
  • vTestPermissions-所有者dbo

ビューから選択すると、エラーが発生します。

SELECT権限がオブジェクト 'table3'、データベース 'TEST'、スキーマ 'Security'で拒否されました

スキーマとテーブルにSELECTオプションを付けて、または付けずにGRANT権限を与えようとしましたが、これにより、基になるテーブルをユーザーが使用できるようになります。

これに関するどんな助けでも大歓迎です。

5
Tim

ビューとテーブルの所有者がすべて同じ場合は、ビューに対する選択権限を付与するだけで十分です。これは 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';

...その後、所有権の連鎖を介してビューからのアクセスを許可し、テーブルへの直接アクセスを防止します。

それがお客様のニーズに適さない場合は、より複雑な構成を検討する必要があります。

4
Paul White 9