
困っています。仮想プライベート サーバー (Windows Web Server 2008 SP2、IIS7、SQL Server 2008 Express) 上にクライアント サイトがあります。
2 番目の Web アプリケーションをセットアップして、更新が公開される前に確認できるようにしたいと考えています。IIS7 で Web アプリケーションを作成し、SQL Server に 2 番目のデータベースを追加しました。2 番目のデータベースは、基本的に運用データベースのコピーであり、データベース名に 'DEV' というプレフィックスが付けられ、いくつかのテーブルにいくつかの新しいフィールドがあります。
私の実稼働サイトは正常に動作します。しかし、テスト サイトは SqlException を返します: 「無効な列名 'version'」。これは新しいフィールドの 1 つであり、開発サイトが開発データベースではなく実稼働データベースを参照していると考えられます。ただし、接続文字列は異なるデータベースを指しています (ログインは両方とも同じですが)。
- 運用サイト: "Server=.\SQLExpress;Database=myDbName;User ID=myUserName;Password=myUserPassword;"
- 開発サイト: "Server=.\SQLExpress;Database=DEVmyDbName;User ID=myUserName;Password=myUserPassword;"
これは私が見逃している明らかなことのように思えます。同僚は、2 番目の IIS アプリケーション用に別のアプリケーション プールを作成することを提案しましたが、役に立たなかったようです。
さらなるテスト後の更新:
開発サイトの接続文字列を次のように変更しました
"Server=.\SQLExpress;Database=DEVmyDbName;User ID=devuser;Password=myNewDifferentPassword;"
データベースに新しい SQL サーバー ログインを作成し、開発データベースへのアクセスのみを許可しました。また、開発データベースをアカウントの既定のデータベースとして設定しました。運用ログインから開発データベースへのアクセスを削除しました。サイトにログインしようとすると、次のエラーが表示されます。
- サーバー プリンシパル「devuser」は、現在のセキュリティ コンテキストではデータベース「myDbName」にアクセスできません。
その結果、私が確実に知っていることが 2 つあります。
- ログインに新しいユーザー名を使用しているので、アプリが私が入力した接続文字列を使用していることがわかります。
- 何らかの理由で、ログインすると、指定されたデータベースを無視し、代わりに本番データベースを使用しようとしているようです。
まだ困惑しています。
答え1
さらに調査を進めた結果、原因が分かりました。それは、NHibernate の構成に関連するアプリケーションの問題でした。設定されていた NHibernate 構成オプションの 1 つに「default_schema」がありましたが、これを削除すると、アプリは正しいデータベースに接続するようになりました。
default_schema プロパティが、接続文字列で指定されたデータベースを上書きしていたようです。
答え2
複数の接続文字列があるようですが、アプリケーション内のどこかに 1 つが保存されている可能性はありますか?
開発システムのみに新しいユーザー ID/パスワードを作成し、それを使用するように開発接続文字列を変更します。接続できる場合は、問題は他の場所にあります。
SQL のフルバージョンにアクセスできる場合は、SQLExpress インスタンスに対してプロファイラーを実行し、アクティビティを監視できます。