私はms sql 2008を使用していて、別のデータベースを参照するデータベース名を作成しようとしています。たとえば、「Dev」、「Test」、「Demo」は、複数の構成ファイルから参照できるデータベース名ですが、各名前は「db20080101」や「db20080114」などの別のデータベースを指します。
[編集]一部の構成は、コードを制御するアプリケーション用で、一部は構成しません(例:MSレポートサービスのデータソースファイルの構成)[/編集]
Sqlserverは、View、Table、Sproc、またはFunctionの同義語のみをサポートしているようです。また、エイリアスはテーブル名と列名です。
私がドキュメントで見逃したこれを行う方法はありますか?誰かが回避策について何か提案がありますか?
テーブルまでの3部表記とエイリアスを使用します。例
select * from tempdb.dbo.sysobjects a
join master.dbo.sysobjects b on a.id = b.id
私は別の設定ファイルを使用してこれに似た何かを行いました。
新しい構成ファイルは、総称名をそのデータベースに接続するために必要なすべての情報(DB名、ユーザー名、パスワードなど)にマップし、接続関数は総称名を引数として受け取ります。
db.config:
DEV_DB_NAME = db20080101
DEV_DB_USER = dev_user
DEV_DB_PASS = dev_pass
TEST_DB_NAME = db20070101
TEST_DB_USER = test_user
TEST_DB_PASS = test_pass
接続コード:
db_connection get_connection(string prefix) {
db_connection db_conn = new db_connection;
string db_name = get_config_value(config_path, prefix + "_DB_NAME");
string db_user = get_config_value(config_path, prefix + "_DB_USER");
string db_pass = get_config_value(config_path, prefix + "_DB_PASS");
db_conn.connect(db_name, db_user, db_pass);
return db_conn;
}
次に、dbエイリアスを引数としてget_connection()を呼び出すだけです。
リンクサーバーを使用してこれをシミュレートする方法があります。これは、同じデータベースのセットを持つ2つのSQLサーバーがあり、1つは開発/テスト用、もう1つはライブ用であると想定しています。
上記はSQL Server 2005の場合ですが、2008の場合も同様です。
これが完了したら、次のようなSQLを記述できます。
SELECT * FROM liveservername.databasename.dbo.tablename
これで、リンクサーバーを使用して開発サーバーでスクリプトを実行すると、スクリプトが正常に動作し、開発サーバーからデータを正しく取得できます。また、ライブサーバーでまったく同じスクリプトを実行すると、スクリプトは正常に動作します。
これはおそらくすべての状況で役立つわけではありませんが、ビューを使用するオプションはまだあります。ビューに適切なIDキー(主キー)がある限り、ビューに挿入、削除、更新、選択できます。別のデータベースを指す場合は、ドロップして再作成し、別のスキーマを取得する必要があります(テストまたは本番、あるいはその両方でスキーマに変更を加えながら本番とテストの間で作業している場合)。
シノニムは、別のデータベースに移動して3部または4部の名前を付ける場合に便利ですが、セット名を付けることができるようにしたい場合は、固定名を使用できるリンクサーバーも機能します。テーブル名が両方のデータベースで同じで、prodとtestの間を指しているだけの場合。