以前にも書いた ように、MS SQL Server 2005は、データベース1個を1つのmdfファイル(正確にはトランザクションログとの二つ)に収め、好きな所に配置して運用ができます。同じMSのJET DB(AccessのDBエンジン)のmdbファイルみたいな運用が考えられるわけで、これを便利と考えられる人には結構便利ですが、セキュリティーや安全性上ずさんだといえばそう。
ただmdbほどお手軽ではなく、開く前にmdfファイルをSQL Server 2005に登録しないといけません。この登録作業がAttach、登録解除がDetatchです。Attachは- SQL Server Management Studio (Express) でツリーのDetabasesを右クリック、Attachで登録する
- ADO/ADO.NETのConnection StringにAttachDbFilename=(mdfファイル名)を指定して接続
が、この処理はCREATE DATABASE/CREATE ANY DATABASE/ALTER ANY DATABASE の権限を持っているユーザーしかできません 。最も分かりやすいこの権限を持ったユーザーは管理者(Administrator)です。つまり、制限ユーザーにとってはあまりお手軽ではない。またAttachDbFilenameの方法を使った場合、Detactchしないと次の接続時にすでにAttachされているファイルをまたAttachDbFilenameしようとしたとして、エラーになるそうです。
これの対策として、User Instance を使う方法があります。これはそのユーザー専用の仮想的なデータベースインスタンスを作ることで、そのインスタンス上だけではユーザーは特権的振る舞いができるようにするもののようです。しかもデータベースをシャットダウン後は自動的にDetatchされるので、次回接続時に二重Atatchのエラーも出ません。
使い方は簡単。Connection Stringにuser instance=trueを指定するだけ。Provider=SQLOLEDB.1; Data Source=.¥SQLEXPRESS; Integrated Security=true; attachDbFilename=C:¥TEST.MDF; User Instance=trueただし使用に制限があります。
- SQL Server 2005 Expressにしか使えない(上位有償エディションはだめ)
- ADO.NET上でしか使えない
で私、SQL Server 2005 Express+Open Office Baseで無料でAccessの代わりになる環境ができないかと思ったわけです。Open Office Baseには既存のデータベースに接続→ADOがありまして、Connection Stringを指定すればSQL Server 2005にmdfファイルを指定して接続できるはず・・・だめでした。Open Office BaseはADO(Visual Studio 6時代)であって、ADO.NETじゃないみたいです。
ちなみに管理者権限なら、以下のConnection string (URL)でOpen Office Baseから接続できます。Provider=SQLOLEDB.1; Data Source=.¥SQLEXPRESS; Integrated Security=SSPI; Persist Security Info=False; attachdbfilename=C:¥TEST.MDF;
ただし一回Attachされると次回はエラーとなりますので、attachdbfilenameをInitial Catalogに変更する必要があります。
[参考]
Comments