著作一覧 |
さて、SQL Expressでしょぼい(といっても最大10GB)システムを作っているわけだが、困ったことに気づいた。
IIS上のASP.NETからアクセスできない。SqlConnectionに、"Server=127.0.0.1;Initial Catalog=Master;Integrated Security=True"
を設定してもエラーとなる。
最初権限の問題かと思って、試しにAdministratorにインパーソネート(あやしい)してみたが、だめだ。そういう問題ではなく、SQL Expressのログインそのものの問題のようだ(というか、インパーソネートしても権限は乗り移ってもユーザーが変わるわけではないのか、IISがSQL ServerへのWindows認証で与えるものはインパーソネート前のオリジナルに変えているのだろう)。
困った。
1つの解決策は、Instance=Yesにして、App_Dataの下のファイルをデータベースとして与えることだが、それだとバッチ(朝マスターが配信されてくるのでそれをバッチで取り込んで、夜になったらバッチで取り出すみたいな昔ながらのシステムなわけだ)でのハンドルが厄介だ。
で、いろいろ調べたが、どうにもならないので、IISが利用するログインユーザをデータベースに設定した。
次のようになる。
Create login [IIS_APPPOOL\(POOL名)] FROM Windows Create User IISAppPoolUser for LOGIN [IIS_APPPOOL\(POOL名)] Sp_addrolemember ‘db_datareader, 'IISAppPoolUser’
ここでは読み込み専用としたが、もちろん必要に応じて、db_datawriterを設定する。
その後、AppPoolのIdentityをLocalSystemにするというのを見つけた。それでも良いようだ。
ジェズイットを見習え |
たぶんExpressだけではなく、製品版のSQL Server含めて、SQL Serverのインスタンス単位でユーザー登録、ロール割り付け、データベース側で権限設定するか、IISユーザーをSQLのインスタンス自信の管理者として権限与えないと(これは非推奨)ダメですね。でもMySQLとかでも、それぞれのルールはあるにせよあんまり変わらないような
そうですか? というのは、製品版のSQL Serverは割と普通に(と書いているうちに、SQLサーバの(Windowsではなく)ユーザでログインさせる運用にずーっと伝統的にしているからか、と気づいてしまいましたよ。だから違和感がありまくるはずですね。