私はデータベースに対する完全な管理者権限を持っているため、ビューの定義を照会および表示できます。ただし、JDBC Jenkinsのジョブマジックで読み取り専用ユーザーを使用してビューにクエリを実行します。問題:私の管理者ユーザーとは異なり、読み取り専用ユーザーにはビューのコード/定義が表示されません。
このクエリは、管理者として行動するときにすべてのビューに必要なすべてのビュー定義とメタデータを提供します。
SELECT name AS VIEW_NAME,
definition,
create_date,
modify_date
FROM [my_database].[sys].[all_views]
JOIN [my_database].[sys].[sql_modules]
ON [my_database].[sys].[all_views].object_id = [my_database].[sys].[sql_modules].object_id
その結果、クエリを管理者として実行すると、次のようなエントリが表示されます。
name | definition | create_date | modify_date
sample_view | SELECT * FROM bla | 01.01.2017 | 02.01.2017
ただし、読み取り専用ユーザーで行う場合はそれほど多くありません。
name | definition | create_date | modify_date
sample_view | null | 01.01.2017 | 02.01.2017
ここでは、読み取り専用ユーザーの許可構成を確認できます。私は彼に必要な許可を与えましたが、ビュー定義は結果セットでユーザーに表示されません。
さらに、ユーザーがSELECTおよびVIEW定義ステートメントを実行できるようにして構成を保存した後、SELECTおよびVIEW DEFINITIONの2番目のエントリが構成テーブルに追加されたのは非常に奇妙です。
INFORMATION_SCHEMA
およびsys
スキーマに対するVIEW DEFINITIONおよびSELECT権限を付与するだけでは、ビューの定義を表示する権限が付与されません。
追加した権限により、sysスキーマのすべてのオブジェクトに関する情報とinformation_schemaが提供されます。
他のスキーマで作成されたビュー定義を見たい場合は、その特定のスキーマにユーザーにVIEW DEFINITION
を提供する必要があります。
など:GRANT VIEW DEFINITION ON SCHEMA::SchemaWhereViewsAreCreated TO [YourUser]
VIEW DEFINITION
興味のあるビューで直接、ユーザーが次のようにその定義を見ることができるようにします。
grant view definition on object::sch.vw_MyView to MyUser
スキーマに権限を与えるべきではありません。この場合、ユーザーはそのスキーマのすべてのオブジェクト定義(関数/ストアドプロシージャなど)を見ることができるため、最小特権の原則に違反します。