web-dev-qa-db-ja.com

SQL Server-異なる所有者からスキーマ内のデータにアクセスするビューにSELECT権限を付与する方法

データベースの権限に関する問題に対処するための支援が必要です。

これはシナリオです:

1データベース

4スキーマ

  • schemaA;所有者dbo
  • schemaB;オーナーownerX
  • schemaC;オーナーownerX
  • schemaD;オーナーownerX

schemaDには、スキーマに割り当てられたテーブルとビューから情報を取得するviewABCという名前のビューがありますschemaAschemaB e schemaC

ユーザーserXにはviewABCに対するSELECT権限があります。

次のコマンドを使用して、権限を付与します。

GRANT SELECT ON schemaD.viewABC TO userX;

serXに対して、ビューに対してSELECTを実行しようとすると、次のようになります。

SELECT * FROM schemaD.viewABC;

エラーが発生します:

SELECT権限がオブジェクト 'tableA'、データベース 'MyDatabase'、スキーマ 'schemaA'で拒否されました。

tableA異なるスキーマ、異なる所有者(dboの代わりにownerX)にあり、SQLServerがuserXを適用するためエラーが発生することを理解しています許可する権限またはアクセスを拒否serXがtableAに明示的にアクセスできない場合クエリの実行によりエラーが返されます。

これを解決するにはserXのtableAにSELECT権限を付与せずに

6
Emerson JS

Dan Guzmanがあなたの答えで私に与えた提案の1つに基づいており、これを読んだ後 question 私は私の問題の回避策を見つけました。

明らかに、上記のシナリオでは、userXSELECTviewABCでSELECT権限も付与せずに権限を付与する方法はありませんtableA

私が見つけた解決策は次のとおりです:

  • schemaDを作成しました Table-Valued Function を作成しましたviewABCの同じレコードセットを返します-にもかかわらずownerXschemaAの所有者ではないため、tableAに対するSELECT権限があります

  • EXECUTE AS は、関数の実行がownerX権限を使用することを保証するために使用されました-このコンテキストでは、userXはtableAを持っています

  • touserXには、作成された関数のSELECT権限が付与されました-EXECUTE権限ではないため、 関数はテーブルを返します


Table-Valued Functionサンプルコード:

CREATE FUNCTION schemaD.udfABC ()
RETURNS @tabABC TABLE (
  fieldA INT NOT NULL, fieldB INT NOT NULL, fieldC INT NOT NULL
)
WITH EXECUTE AS OWNER
AS
BEGIN
  INSERT INTO @tabABC (fieldA, fieldB, fieldC)
    SELECT a.fieldA, b.fieldB, c.fieldC
      FROM schemaA.tableA a
     INNER JOIN schemaB.tableB b ON a.id = b.idA
     INNER JOIN schemaC.tableC c ON b.id = c.idB;

  RETURN;  
END

SELECT権限の付与:

GRANT SELECT ON schemaD.udfABC TO userX;

これでuserXはこのコマンドを使用してデータを取得できます。

SELECT * FROM schemaD.udfABC();
6
Emerson JS

ビューの基になるオブジェクトの所有権チェーンが壊れているため、SELECT権限を付与することを回避する方法は考えられません。 1つの解決策は、TableAの所有者をownerXに変更して、ビューの所有権チェーンが壊れないようにすることです。

ALTER AUTHORIZATION ON OBJECT::dbo.tableA TO ownerX;

これにより、dbo.tableAに対するownerX CONTROL権限が付与されることに注意してください。それが受け入れられない場合は、代わりにモジュール(テーブル値関数など)を使用して、必要なオブジェクトSELECT権限を持つユーザーに基づく証明書で署名する必要があります。

4
Dan Guzman