8

データベースからデータを選択する一連のストアドプロシージャがあります。プロシージャに実行権限が付与されているロール(cctc_reader)があります。プロシージャの1つが別のストアドプロシージャを呼び出しrecControl_system_option、それがクエリを実行しInformation_schema.columnsます。

問題は、このプロシージャでクエリが実行されることです

select column_name from information_schema.columns where table_name = 'recControl_manager'

レコードを返しません。cctc_readerには、次の権限が付与されています。

  • 各selectproc
  • recControl_system_option

したがって、理論的にはこれでうまくいくはずです。dboで実行しても問題ありません。

db_datareaderをcctc_readerに付与した場合、クエリは問題ありませんが、すべてのテーブルにリーダー権限を付与したくありません(したがって、ストアドプロシージャを使用した理由)。いくつかの記事で提案されているように、マスターデータベースのInformation_schemaにSelect権限を付与しようとしましたが、それでもこれを機能させることができません。

助言がありますか?

4

3 に答える 3

6

オブジェクト メタデータの可視性は、VIEW DEFINITION権限の対象となります。

GRANT VIEW DEFINITION ON ... TO cctc_reader;

VIEW DEFINITION 権限により、ユーザーは、権限が付与されているセキュリティ保護可能なリソースのメタデータを表示できます。ただし、VIEW DEFINITION 権限は、セキュリティ保護可能なもの自体へのアクセスを許可しません。たとえば、テーブルに対する VIEW DEFINITION 権限のみが付与されたユーザーは、sys.objects カタログ ビューでテーブルに関連するメタデータを表示できます。ただし、SELECT や CONTROL などの追加の権限がないと、ユーザーはテーブルからデータを読み取ることができません。

アクセス許可を付与するためのセキュリティ保護可能な権利は、シナリオによって異なります。dbo または他のスキーマである可能性があり、データベース自体である可能性があり、個々のテーブルである可能性があります。私があなたの立場なら、recControl_system_option プロシージャにコード署名し、サーバー レベルで署名に VIEW ANY DEFINITION を付与します。これは、ロールを使用してロールにアクセス許可を付与するよりもはるかに優れた安全な方法です。プロシージャーに署名し、署名に対するサーバー・レベルの許可を付与する方法の例については、アクティブ化されたプロシージャーへの署名を参照してください。

于 2010-08-05T15:44:00.113 に答える
2

Remus が述べたように、メタデータの可視性は、システム テーブルとビューにクエリを実行するときに返されるデータに影響します。セキュリティ保護可能なもの (オブジェクト、ログインなど) に対する権限がない場合、それは表示されません。

状況に応じて、内部呼び出しに EXECUTE AS OWNER を許可するか、次のような udf で Information_schema.columns をラップします。EXECUTE AS OWNER

この手法を使用して、メタデータをクエリします。

于 2010-08-05T16:04:34.143 に答える
0

これを別の場所で見つけて、データベースで System sproc sp_columns を呼び出す sproc を作成します。sproc は、他の sproc と同じ権限で実行できます。欠点は、返されたセットには、おそらく関心のない多くの列が含まれていることです。あえて、sproc を改良することができます。フィールドの選択はコードで行うことにしました。

CREATE PROCEDURE [dbo].[proc_tblMyTableSchemaGet] 

はじめに

SET NOCOUNT ON;


exec sp_columns @table_name = 'myTable', @table_owner = 'dbo';

終わり

于 2018-06-22T04:14:25.297 に答える