Ruby on Rails で企業向け Web アプリを開発できないかと企んでいます。その際使用するデータベースとして MySQL のようなフリーでオープンなものは大企業では認められない可能性があり、やはり Microsoft SQL Server(MSSQL) じゃないと駄目です、となることが大いに考えられるので実際に接続を試してみました。以下は忘れないよう自分へのメモ代わりでもあります。
手始めに試したのは、Rails 1.1.6 + Microsoft SQL Server 2005 Express Edition(以下 Express Edition)という組み合わせ。Express Edition は SQL Server 2005 のローエンドバージョンですが、無償でダウンロード可能なのです。
Visual C# と英語の両方を学べるお得なサイトで取り上げましたが、Visual C# 2005 Express Edition といいこの SQL Server 2005 Express Edition といい、Microsoft 製品が結構無料で使えるようになっているんですね。オープンソースや無料サービスに取り囲まれていて、エンタープライズ向け製品とは離れていたこの1年半の間に状況が変わっていることに少しびっくりです。まあ、Microsoft 側もそうせざるをえないくらい、無料でも良い製品が充実してきたということですね。
Express Edition は Visual C# 2005 Express Edition をインストールしたときに、ついでにセットでインストールしていたのですが、テーブルを作成したり参照したりする管理用GUIツールはなかったので、SQL Server 2005 Express Edition の製品ページより、SQL Server 2005 Express Edition Toolkit をダウンロードします。インストールオプションで GUI ツールの SQL Server Management Studio Express を選択します。
インストール後、SQL Server Management Studio Express を起動し、適当にサンプルのデータベース(たとえばDB名:test)を作成し、このデータベースにアクセスできる test という名前のユーザーを [セキュリティ] > [ログイン] に作成します。
test ユーザーですが、細かな設定内容は以下のとおり。なにぶん、昔のSQL Server を使っていた頃の記憶をもとにとりあえず動けばいいや、というつもりで設定しているのでセキュリティなどの細かい配慮は全然おこなっていないので悪しからず。
- [全般]SQL Server 認証にしてパスワードを test に設定
- [全般]既定のデータベースは test(データベース)、既定の言語は Japanese
- [サーバーロール]sysadmin にチェック
- [ユーザーマッピング]test(データベース)にチェック
それと、ツリーメニューの一番のおおもとのサーバーオブジェクトの上で右クリック、[サーバーのプロパティ]上の[セキュリティ]で、認証を [SQL Server 認証モードと Windows 認証モード]に設定しておきます。これをやっておかないと後述する接続テストのところで、
OLE error code:80004005 in Microsoft OLE DB Provider for SQL Server
ユーザー 'test' はログインできませんでした。このユーザーは SQL Server の
信頼関係接続と関連付けられていません。
HRESULT error code:0x80020009
例外が発生しました。
というエラーメッセージが出ます。
さて、以上で Express Edition 側の設定は終了。次は肝心の Rails 側の設定です。
基本的にはHowtoConnectToMicrosoftSQLServer
(翻訳はこちら)にある説明のとおりなのですが、若干わかりにくい、というかこの説明どおりにやってもうまくいきません。
忠実に指示に従い、http://rubyforge.org/projects/ruby-dbi/ より Ruby-DBI のソースをたどり dbi-0.1.1.tar.gz を取ってきて展開し、lib\dbd\ADO.rb を
C:/ruby/lib/ruby/site_ruby/1.8/DBD/ADO/ADO.rb
にコピー。
続いて、database.yml を「最新版ならこうです」というサンプル通り、上記 Express Edition の設定を反映して下記のように設定します。
development:
adapter: sqlserver
database: test
host: .
username: test
password: test
以上終わったところで、ためしに db/migrate 以下に、顧客テーブルを作成する以下のようなマイグレーション用スクリプト 001_create_customers.rb を作成し、rake db:migrate --trace を実行してみます。
class CreateCustomers < ActiveRecord::Migration
def self.up
create_table :customers do |t|
t.column :name, :string
end
end
def self.down
drop_table :customers
end
end
すると、
no such file to load -- dbi
というエラーとともにトレースの結果がずらずらと表示されあえなく失敗。
どうやら Ruby-DBI のインストールが必要そうだということで、ruby-dbi の README にあるとおり、
ruby setup.rb config
ruby setup.rb setup (筆者はこちら失敗してしまいましたが)
ruby setup.rb install (こちらはうまくいきました)
を実行して、インストールしたあと、再度 rake db:migrate --trace を実行してみると、今度は、エラーメッセージが
OLE error code:80004005 in Microsoft OLE DB Provider for SQL Server
[DBNETLIB][ConnectionOpen (Connect()).]SQL Server が存在しないか、
アクセスが拒否されました。
HRESULT error code:0x80020009
例外が発生しました。
に変わって進展ありです。
. では SQL Server が参照できないということです。
サーバーのプロパティを変更したとき、サーバーの名前が (ホスト名)\SQLEXPRESS となっていたことを思い起こし、
development:
adapter: sqlserver
database: test
host: .
host: .\\SQLEXPRESS
username: test
password: test
に変更し、改めて rake db:migrate --trace を実行したところめでたく customers テーブルが作成されました。
データを挿入してみたりしてみましたが、いまのところ以上の設定でうまくいっています。
新たな情報がございましたら、以下にコメントやトラックバックをお願いします。