web-dev-qa-db-ja.com

非表示のリソースデータベースmssqlsystemresourceでSELECTをどのように許可しますか?

このクエリを実行するとエラーが発生します。

    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に関する他の投稿をいくつか読んだことがありますが、これはこれには関係ありません。

  • このログイン/ユーザーには何も割り当てられていません
  • PUBLICロール(サーバーまたはデータベース)のメンバーシップは、権限が「既知の正常な」サーバーと同じであるため、何の影響もありません。
  • ユーザーにデータベース全体に対する包括的なSELECT権限を持たせたくありません。
3

あなたが途中でつまずいた場所がわからないが、これは私にとってはうまくいきます:

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;
4
Aaron Bertrand