2009年12月12日土曜日

SQLCLRで、アセンブリの権限を「SAFE」以上の権限に昇格する方法。

今回の記事では、いよいよ「SQL CLR」の権限を昇格する方法について書かせて頂きます。

このブログでも度々SQL CLRのプログラムを書かせて頂いておりますが、それらは全て、最低限の権限である「SAFE」権限で動作しておりました。これをもっと上に昇格すると、クエリーの中から外部リソースへのアクセスまで可能になります。

SAFEの上は、EXTERNAL ACCESS」権限と「UNSAFE」権限となります。

つまり、何が出来るのかというと、パッと思いつくだけでも、CSVファイルへの読み書きがクエリーから直接可能になったりするわけです。それだけを取ってみても価値は絶大と言えるでしょうね。

クエリーからCSVを読み込むと言えば、標準のSQL-Server関数ではOpenRowSet()関数があるのですが、現在のところ、64bit Windows7と64bit SQL-Server 2008 Expressの組み合わせでは、MICROSOFT.JET.OLEDB.4.0がうまく動作しないので使えないし、そもそも使えたとしても、拡張子は.TXTでなければならない、フォーマットを別に管理しないと数字と文字列を誤認する危険があるなど、自動ならではのやっかいさが残存してしまいます。
自力で関数が作れる道が開かれるわけで、何にせよ、もろ手を挙げて大歓迎ではないでしょうか。

さて、その方法ですが、例によって詳しくはスクリーンショットを見ていただければと思いますが、ちょっとだけ面倒です。

まず、話の流れから当然ですが、いきなり自分の作ったSQL CLRのアセンブリ(DLL)を登録しようとしても、権限がSAFE以外はエラーになります。

この壁を突破するには、以下の手順で事を進めていただく必要があります。

(1)自分のログオンIDではなくて、saユーザーでログオンします。
(saでなくとも良いのですが、分かりやすいようにsaとしました。自分で自分の権限は、いくらやっても変更できないのに注意が必要です。)

(2)作業用のカレントデータベースは必ずmasterにしておきます。
しないとエラーになってしまいます。

(3)SQL CLR関数を登録するデータベースに、以下のコマンドで信頼性を与えます
私の場合は「SPDB」というデータベースにしているので以下のようになりますが、必要に応じてデータベース名は変更する事になりますね。
ALTER DATABASE SPDB SET TRUSTWORTHY ON;

(3)権限を与えたいユーザー(私の場合はmorimori)に対して、GRANTコマンドでもって権限を昇格します。私の場合は以下のようになりますが、ユーザー名は適宜変更する事になります。

GRANT EXTERNAL ACCESS ASSEMBLY TO morimori;
または
GRANT UNSAFE ASSEMBLY TO morimori;
として権限昇格。

(4)saではなく、今度は権限を与えたユーザーでログオン(私はmorimori)します。
うっかり忘れてsaのままで作業すると、(5)のアセンブリの登録でエラーになってしまいますのでご注意下さい。

(5)いよいよ、アセンブリを登録。
すると、以前はPERMISSION_SET = SAFE以外はエラーになっていたのに、
PERMISSION_SET = EXTERNAL_ACCESS
もしくは
PERMISSION_SET = UNSAFE
が成功します。

これで、いよいよ、たとえば、SQL-Server 2008 Expressから直接CSVファイルを読み込む関数などを自作する道が開けたわけです。
本日の記事はここまでにさせて頂いて、後日、CSVファイルを読み込む関数を作りたいなぁ・・・と思います。

ただ、テーブル型の値を返すSQL CLR関数になるのですが、通常のスカラ型関数と比較して、記述がかなり独特で複雑になってしまいますが、例によって、その価値は極めて高いものだと思いますので、やっておくと大吉でしょうね。