web-dev-qa-db-ja.com

dbo以外のテーブルでは選択せずに、dboビューに選択を許可

SQL Server 2008 R2

「JoeBlogs」というログイン&ユーザーがいます。このユーザーには、JoeBlogsの独自のデフォルトschemaがあります-データベースへのPublicアクセスのみがあります。

次に、SELECTビューでdboを付与しました。ただし、dboビューはnon-dboスキーマに属する基になるテーブルからデータを選択します-そのため、基になるテーブルへのアクセスが拒否されたというビューからの選択エラーが発生します。

dboビューへのアクセスを選択できるようにユーザーを構成するにはどうすればよいですかnot基になるnon-dboテーブル?

これは可能ですか?

ジョードン

4
HeavenCore

ソリューションに進む前に問題を理解する必要があります。
ビューから選択すると、SQL Serverシステムは権限を2回チェックします。
ビューから選択したときと、ビューが基になるテーブルを参照したとき。
明らかに、ユーザーが基礎となるテーブルに対する権限を持っていない場合、2番目のチェックは失敗します。

マイクロソフトはこれを「所有権連鎖」(OCと呼ばれる)で解決しました。
OCは、ビューがテーブルを参照しているときに行われる権限チェックをバイパスします。
Onlyビューの所有者がテーブルの所有者と同じ場合。
問題は、OCが権限チェックを完全にバイパスしているということです。つまり、OCは拒否もバイパスできるということです...
たとえば、「JoeBlogs」にcreate view権限がある場合、テーブル全体にアクセスできる新しいビューを作成できます。
行動方針を決定する前に、所有権の継承について読むことをお勧めします。

オンラインの本
msdn blog
詳細な例、ビューの代わりにストアドプロシージャを使用

そうは言っても、最初の直感的な解決策は、基礎となるテーブルと同じnon-dboスキーマ(またはnon-dboと同じユーザーが所有するスキーマ)の下にビューを作成することですスキーマ)。
しかし、その解決策が危険すぎるとわかった場合、別の(そしておそらくもっと良い)オプションがあります。
いつでもEXECUTE AS句を使用して関数(マルチステートメントテーブル値関数)を使用できます。
関数構文を作成
節として実行
このメソッドは、関数がexecuteに属しているときに、関数(関数に対するdbo権限)から選択できるようにします。 execute as句で指定されたユーザーには、基になるテーブルに対する権限が必要です。

2
Roi Gavish