Псевдоним базы данных SQL Server - PullRequest
6 голосов
/ 02 июля 2011

Я пытаюсь понять, как можно использовать псевдоним для ссылки на другую базу данных в том же экземпляре, без необходимости использовать жестко закодированное имя.

Сценарий таков:

У меня есть база данных с данными, база данных аудита, в которой хранятся все сделанные изменения. по разным причинам я хочу хранить данные аудита в отдельной базе данных, не в последнюю очередь потому, что они могут быть достаточно большими и для целей отчетности.

В базе данных данных я не хочу ссылаться на это жестко закодированным именем, а псевдонимом, чтобы в разных средах мне не приходилось менять имя и различные sp, чтобы ссылаться на новое имя.

например:

mydevdata
mydevaudit

Если sp существует в mydevdata, например, который вызывает mydevaudit, я не хочу менять sp, когда я иду, чтобы проверить, где БД могут называться mytestdata и mytestaudit. И снова, по разным причинам, имена баз данных могут меняться, в большей степени связанные с пробелами, экземплярами и т. Д.

Так что, если бы у меня была процедура в mydevdata:

proc A
begin

insert into mydevaudit.table.abc(somecol)
select 1

end

когда я иду на тестирование, я не хочу, чтобы процедура менялась для ссылки на другое имя (предположим, что это произошло)

Вместо этого я хочу сделать что-то вроде:

proc A
begin

insert into AUDITEBALIAS.table.abc(somecol)
select 1

end

Мне интересно узнать, как я могу сделать что-то подобное, а также плюсы и минусы.

Кроме того, dymnamic SQL не вариант.

Заранее спасибо за помощь.

Ответы [ 2 ]

12 голосов
/ 02 июля 2011

Вы можете использовать синонимы

CREATE SYNONYM WholeTableAliasWithDBetc FOR TheDB.dbo.TheTable

Это означает, что все ссылки на объекты в локальной БД являются локальными для этой БД, за исключением синонимов, которые скрывают другую базу данных от вас..

Вы также можете использовать хранимые процедуры в БД аудита.Существует третья форма EXEC , которая мало используется, где вы можете параметризовать имя сохраненного процесса

DECLARE @module_name_var varchar(100)
SET @module_name_var = 'mydevaudit.dbo.AuditProc'
--   SET @module_name_var = 'whatever.dbo.AuditProc'
EXEC @module_name_var @p1, @p2, ...

Очевидно, вы можете изменить module_name_var, чтобы использовать любую БД, которая вам нравится

0 голосов
/ 20 декабря 2011

Я только что опубликовал это на Как создать синоним Sql или «Псевдоним» для имени базы данных? , который является обходным путем для той же ситуации:

Существует способ симуляцииэто с помощью связанного сервера.Предполагается, что у вас есть два сервера SQL с одним и тем же набором баз данных, один для разработки / тестирования и один живой.

  1. Откройте SQL Server Management Studio на вашем сервере разработки / тестирования
  2. Щелкните правой кнопкой мыши Объекты сервера> Связанные серверы
  3. Выберите новый связанный сервер ...
  4. Выберите страницу "Общие"
  5. Укажите псевдоним имя вПоле связанного сервера - обычно это имя вашего live server
  6. Выберите собственного клиента SQL в качестве поставщика
  7. Введите sql_server для названия продукта
  8. В источнике данных укажите имя сервера разработки
  9. Добавить параметры безопасности и сервера по вкусу
  10. Нажмите OK

Выше приведено для SQL Server 2005, но оно должно быть аналогичным для 2008

После того, как вы это сделаете, вы можете написать SQL следующим образом:

SELECT * FROM liveservername.databasename.dbo.tablename

Теперь, когда ваши скрипты работают насервер разработки со связанным сервером обратно к себеу будет работать правильно, извлекая данные с сервера разработки, и когда на реальном сервере будут запущены точно такие же сценарии, они будут работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...