Ответ 1
использовать 3 части обозначения и псевдоним до таблицы, пример
select * from tempdb.dbo.sysobjects a
join master.dbo.sysobjects b on a.id = b.id
Я использую ms sql 2008 и пытаюсь создать имя базы данных, которое ссылается на другую базу данных. Например, "Dev", "Test", "Demo" будут именами баз данных, которые я мог бы ссылаться на мои несколько файлов конфигурации, но каждое имя будет указывать на другую базу данных, такую как "db20080101" или "db20080114".
[Edit] Некоторые из конфигураций предназначены для приложений, которые управляют кодом, а некоторые из них не являются (например, конфигурациями файлов данных службы отчетов MS Reporting) [/Edit]
Кажется, что sqlserver поддерживает только синонимы для View, Table, Sproc или Function. И Alias 'предназначены для имен таблиц и столбцов.
Есть ли способ сделать это, который я пропустил в документах? У кого-нибудь есть предложения по обходному пути?
использовать 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;
}
Затем вы просто вызываете get_connection() с вашим псевдонимом db в качестве аргумента.
Есть способ имитировать это с помощью связанного сервера. Это предполагает, что у вас есть два SQL-сервера с одним и тем же набором баз данных, один для разработки/теста и один live.
Вышеупомянутое относится к SQL Server 2005, но должно быть похоже на 2008 год
Как только вы это сделали, вы можете написать SQL следующим образом:
SELECT * FROM liveservername.databasename.dbo.tablename
Теперь, когда ваши сценарии запускаются на сервере разработки с привязанным сервером к себе, они будут корректно вынимать данные с сервера разработки и при выполнении одинаковых сценариев на реальном сервере они будут работать нормально.
Я знаю, что это, вероятно, не поможет во всех ситуациях, но у вас все еще есть возможность использовать представления. Вы можете вставлять, удалять, обновлять, выбирать в представлении, если у него есть правильный ключ идентификации (первичный ключ). Если вы укажете его на другую базу данных, вы должны сбросить и воссоздать, чтобы получить другую схему (в случае, если вы работаете между производством и тестом при внесении изменений в схему в тесте и/или производстве.
Синонимы полезны, когда вы переходите к другой базе данных и имеете имя 3 или 4 части, но если вы хотите сделать так, чтобы вы могли иметь заданное имя, также будет работать связанный сервер, который позволит вам использовать фиксированное имя, если имена таблиц одинаковы в обеих базах данных, и вы просто указываете между prod и test.