こないだ「別DBのテーブルを使ったViewへのアクセス権設定」でちょっとハマりかけましたので、そのことを書いてみます。年に1度あるかないかのプチ技術系ネタです。
一応同じサーバーインスタンス内にある2つのDBについての話なのですが
・Sono1DB上のView_Xと、
・Sono2DB上のテーブルY、があったとして、
Sono1DBのView_Xが、Sono2DB.テーブルYのデータを参照しているケース。
問題はこのView_Xを、とあるユーザAさんからSELECTできるようにするために、
Aさんに対して単純にGRANT SELECT ON View_Xとしただけではダメだったことです。
普通Viewを作れば、そのViewの中でどのテーブルを使ってようが、アクセス制御はViewに対してのみ施せばいいじゃないですか。それがViewのメリットだし。
でも別DBだとそう簡単じゃないんです。View_XをSELECTすると、「おめーはSono2DBのテーブルYを見ることはできねーよ」と怒られます。えー。
だからといってユーザAさんに対しSono2DB.テーブルYのアクセス権を付与するのも芸がないじゃないですか。ていうかテーブルYを覗かれちゃイヤだからViewにしてるわけですし。
こういうときにスパッと解決策がわかれば良いのですが、Google先生に聞いてもMSDN先生に聞いてもあまりドンピシャの回答がなかったので、こうやってここに書いてます。
答えは「所有権の継承」です。MSDNのこちらで解説されてます → 所有権の継承
前提として「複数データベース間での所有権の連携」なるものをサーバーインスタンスまたはDB単位でONにしとかないとだめなのですが(デフォルトはOFF)、要は
・1個のシーケンス内では(つまりViewとかトリガーとかプロシージャとかでは)
・たとえ別DB間であったとしても、
・そのオブジェクトの所有者が同一なら
・アクセス権とか下らないことは評価しません!どうぞご自由にご覧ください。
という仕様なのだそうです。正しくは上のリンクをよく読んでください。
つまり、関係するテーブルとかビューとかシノニムとかの所有権を、ALTER AUTHORIZATIONとかで全て同じユーザに設定しておけば全て解決です。わーい。
もちろん複数DB間での所有権の連携をONにすることで、今まで「このDBについてのみdb_owner設定してあげる」としていたつもりのユーザが、気づけば「実は全DBいじれちゃうもんね」と化ける様な類のセキュリティリスクが生じるので、その辺は重々注意する必要があります。
こういうのって意外とハマり易いポイントじゃないかと思ったので書いてみました。それても基本中の基本でしょうか?(^_^;)。ではまた。
※当ブログは技術系ブログじゃないので、この手の話題は滅多にありません。
0 件のコメント :
コメントを投稿