人気ブログランキング | 話題のタグを見る
(SQL Server)SQLサーバの無人インストールとインストール後の各種設定設定 Part3
(SQL Server)SQLサーバの無人インストールとインストール後の各種設定設定 Part2の続き(最終回)です。

今回はアプリケーションで使う初期データベースファイルのアタッチの方法です。


普通に CEREATE 文や INSERT 文で初期化してもいいのですが、今回はあらかじめ開発用DBで作成しておいた mdf ファイルをアタッチするという方法にしました。
アタッチにはアタッチ対象の mdf , ldf ファイルが必要になります。

また、アタッチ対象の mdf,ldf ファイルのアクセス権をSQL Server が読めるように設定しないと、アタッチ時に下記のエラーが出るようです。

メッセージ 5120、レベル 16、状態 101、サーバー VPC-A、行 1
物理ファイル "c:\testdb\test.mdf" を開けません。オペレーティング システム エラー 5: "5(アクセスが拒否されました。)"。

なので、cacls コマンドでアッタチ対象ファイルのアクセス権を設定します。(下記の例はよくないかもしれませんが、とりあえず EVERYONE フルコントロールです)
(またこのエラーの原因はインスタンスを動かしているサービスの権限が原因だったりすることもあるようです。開発でのメモ参照。)

なお、コマンド途中で確認のために y を押下しないとしないといけないので、その時は echo コマンドと cacls をパイプすればOKみたいです。
詳しくは@IT caclsコマンドをバッチ・ファイルで利用するを参照。

C:\>echo y|cacls c:\testdb\test.mdf /G EVERYONE:F
よろしいですか (Y/N)?処理ファイル: c:\testdb\test.mdf

C:\>echo y|cacls c:\testdb\test.ldf /G EVERYONE:F
よろしいですか (Y/N)?処理ファイル: c:\testdb\test.ldf

そして、アタッチ処理は CREATE DATABASE 文でできるみたいです。
詳しくはMSDN:データベースのデタッチとアタッチMSDN:データベース ファイルを SQL Server Express にアタッチする方法を参照。

>sqlcmd -S localhost -U sa -P 1234 (インスタンスが規定のためサーバ名のみでインスタンス名省略)
1> CREATE DATABASE RhythmSale_test02 ON
2> (FILENAME = N'c:\testdb\test.mdf' ),
3> (FILENAME = N'c:\testdb\test.ldf' )
4> FOR ATTACH;
5> go

実際は上記の CREATE 文をファイルに落としておき -i 引数で読み込ました方がいいでしょう。

>sqlcmd -S localhost -U sa -P 1234 -i SQL書いたテキストファイル名


以下は余談です。
ITpro:SQL Server Expressを「組み込み型」で展開する方法 を見ると、SQL Server Expressは,下記3通りの基本的な展開手法があるとあります。
1.データベースとアプリケーションを個別にインストールする手動展開法
2.mdfファイルをアプリケーションのインストーラからコピーし,「AttachDBFile」というキーワードを接続文字列に使ってファイルを添付してデータベースをインストールするXCopy展開法
3.今まで取り上げてきたアプリケーションのインストール・プロセスの一部としてSQL Server Expressをインストールする組み込み型の展開法

この2.の XCopy 展開法の簡単な紹介です。
これには SQL Server 自体がインストールされインスタンスが起動してないといけません。
mdfファイルのアタッチはアプリケーション側から行います。
アプリケーションの接続文字列を下記のようにすればいいみたいです。

Provider=SQLOLEDB;Data Source=.\;Persist Security Info=True;Password=1234;User ID=sa;Initial Catalog=;AttachDBFileName=|DataDirectory|\test.mdf

詳しくはMSDN:Xcopy 配置 (SQL Server Express)@IT:アプリケーション内でデータベースをアタッチするには?を参照。
しかし、この方法だとローカルのSQL Serverしか使えないということや、mdfファイルもローカルしか使えません。
ローカルシステムやASP.NetのようなアプリケーションでローカルのSQL Server使う場合はいいかもしれませんが、クライントサーバシステムで複数クライアントが使うような場合は難しいでしょう。(スタンドアロンシステムでも3階層にしてアプリケーション層とDBが同じサーバなら使えるかもしれません)
by jehoshaphat | 2009-02-01 00:29 | SQL


<< (SQL Server)SQL... (SQL Server)SQL... >>