このクエリを実行するとエラーが発生します。
SELECT
dependencies.referencing_id as object_id,
dependencies.referencing_minor_id as column_id,
dependencies.referenced_id AS referenced_object_id,
RTRIM(referenced_objects.type) AS referenced_type
FROM
sys.sql_expression_dependencies AS dependencies
JOIN sys.objects AS referenced_objects WITH(NOLOCK) ON referenced_objects.object_id = dependencies.referenced_id
WHERE dependencies.referencing_id != dependencies.referenced_id
エラー:
オブジェクト 'sql_expression_dependencies'、データベース 'mssqlsystemresource'、スキーマ 'sys'に対するSELECT権限が拒否されました。
ログインはPUBLICサーバーロールのメンバーシップのみを持ち、VIEW ANY DATABASEおよびVIEW ANY DEFINITIONを付与されています。比較しているデータベースのPUBLICデータベースロールのメンバーシップを持つユーザーを追加しました。サーバーレベルのアクセス許可で十分だと思いましたが、誤りでした。これは、2014データベースに加えて、2008R2データベースでも行いました。
2014データベースでは、サーバーレベルの権限SELECT ALL USER SECURABLESも付与しました。エラーは解決しませんでした。
データベースに対するユーザーSELECTを許可しました。エラーは解決しませんでした。
SELECT権限を削除し、userをdata_readerデータベースロールに追加しました。クエリは解決されましたが、データは返されません(sysadminと同じクエリを実行すると、130行以上が返されます)。今、私は完全に困惑しています。
上記と同じ結果で、sys.sql_expression_dependenciesのユーザーにSELECTを明示的に許可しました。
これらのアクセス許可を調査した結果、データベースのユーザーにSELECTを付与することは、data_readerロールにユーザーを追加することと同じであるように思われます。しかし、明らかにそうではありません。比較を行うために可能な限り最小の特権セットでログイン/ユーザーを作成したいと思います。
DB全体に対するdata_readerアクセスを許可せずに、mssqlsystemresourceのsys.sql_expression_dependenciesビューへのアクセスを許可するにはどうすればよいですか? mssqlsystemresourceに対してのみSELECTを許可する方法はありますか?
**注-mssqlsystemresourceに関するSEに関する他の投稿をいくつか読んだことがありますが、これはこれには関係ありません。
あなたが途中でつまずいた場所がわからないが、これは私にとってはうまくいきます:
CREATE LOGIN permtest WITH PASSWORD = 'x', CHECK_POLICY = OFF;
GO
USE somedatabase;
GO
CREATE USER permtest FROM LOGIN permtest;
GO
このページ によると、ユーザーはsys.sql_expression_dependencies
に対するSELECT
権限、およびデータベースに対するVIEW DEFINITION
が必要です。
私の実験では、以下はユーザーがビューから選択できるようにしましたが、定義(依存チェーンを含む)を表示する機能がないため、0行を返しました。
GRANT SELECT ON sys.sql_expression_dependencies TO permtest;
実際にsomedatabase
の関係を確認するために、以下も追加する必要がありました。
GRANT VIEW DEFINITION ON DATABASE::floob TO permtest;
さらに細かくする方法は見つかりませんでした(VIEW
/DENY
定義は個々のオブジェクトに対して機能しましたが、データベースレベルの権限がないと、カタログ内の行を表示できませんでした。ビュー、およびDENY
は、オブジェクトがカタログビューに表示されるのを防ぎませんでした。また、定義を表示することもできませんでした)。とにかく、SQL Serverがその粒度を解決するのに苦労しているように思います。テーブルを参照するビューがある場合、ビューに許可がありテーブルに拒否がある場合、カタログビューはどのように見えるべきですか、またはその逆ですか?
データベースにVIEW DEFINITION
を付与したくない場合は、EXECUTE AS OWNER
を使用するプロシージャを作成し、カタログビューから行を選択(フィルタリング?)して、ユーザーに(もちろん、役割にもなります)プロシージャの実行権限。
CREATE PROCEDURE dbo.GetDependencies
WITH EXECUTE AS OWNER
AS
BEGIN
SELECT is_schema_bound_reference --, ...
FROM sys.sql_expression_dependencies;
END
GO
GRANT EXECUTE ON dbo.GetDependencies TO permtest;