データベースの権限に関する問題に対処するための支援が必要です。
これはシナリオです:
1データベース
4スキーマ:
schemaDには、スキーマに割り当てられたテーブルとビューから情報を取得するviewABCという名前のビューがありますschemaA、schemaB 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権限を付与せずに?
Dan Guzmanがあなたの答えで私に与えた提案の1つに基づいており、これを読んだ後 question 私は私の問題の回避策を見つけました。
明らかに、上記のシナリオでは、userXSELECT
にviewABCでSELECT権限も付与せずに権限を付与する方法はありませんtableA。
私が見つけた解決策は次のとおりです:
schemaDを作成しました Table-Valued Function を作成しましたviewABCの同じレコードセットを返します-にもかかわらずownerXはschemaAの所有者ではないため、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();
ビューの基になるオブジェクトの所有権チェーンが壊れているため、SELECT
権限を付与することを回避する方法は考えられません。 1つの解決策は、TableAの所有者をownerXに変更して、ビューの所有権チェーンが壊れないようにすることです。
ALTER AUTHORIZATION ON OBJECT::dbo.tableA TO ownerX;
これにより、dbo.tableAに対するownerX CONTROL
権限が付与されることに注意してください。それが受け入れられない場合は、代わりにモジュール(テーブル値関数など)を使用して、必要なオブジェクトSELECT
権限を持つユーザーに基づく証明書で署名する必要があります。