Создать синоним для всех таблиц в другой базе данных с помощью скрипта - PullRequest
9 голосов
/ 25 августа 2010

Существует ли простой способ создания синонимов для всех таблиц в другой базе данных?

спасибо

РЕДАКТИРОВАТЬ: у меня есть ряд хранимых процедур, которые жестко закодировали некоторые схемы таблиц в запросы выбора,Когда я копирую схемы на новый сервер, SP не работают, потому что схема не существует.У меня мало контроля над целевым сервером, и я не хочу менять весь SP, поэтому я подумал, что синоним может быть хорошим решением.

Ответы [ 3 ]

25 голосов
/ 25 августа 2010

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

select 'create synonym syn_' + t.name + ' for [' + DB_NAME() + '].[' + s.name + '].[' + t.name + ']' 
    from sys.tables t
        inner join sys.schemas s
            on t.schema_id = s.schema_id
    where t.type = 'U'

В качестве примера, выполнение этого с базой данных Master приведет к:

create synonym syn_spt_fallback_db for [master].[dbo].[spt_fallback_db]
create synonym syn_spt_fallback_dev for [master].[dbo].[spt_fallback_dev]
create synonym syn_spt_fallback_usg for [master].[dbo].[spt_fallback_usg]
create synonym syn_spt_monitor for [master].[dbo].[spt_monitor]
create synonym syn_spt_values for [master].[dbo].[spt_values]
create synonym syn_MSreplication_options for [master].[dbo].[MSreplication_options]
10 голосов
/ 26 августа 2010

Создайте хранимую процедуру примерно так:

CREATE PROCEDURE SynonymUpdate
   @Database nvarchar(256), -- such as 'linkedserver.database' or just 'database'
   @Schema sysname -- such as 'dbo'
AS
CREATE TABLE #Tables (
   TableID int identity(1,1) NOT NULL PRIMARY KEY CLUSTERED,
   Table_Name sysname
)
DECLARE
   @SQL nvarchar(4000),
   @ID int
SET @SQL = N'SELECT Table_Name FROM ' + @Database + '.INFORMATION_SCHEMA.TABLES WHERE Table_Schema = @TableSchema'
INSERT #Tables EXEC sp_executesql @SQL, N'@TableSchema sysname', @Schema
SELECT @ID = MAX(TableID) FROM #Tables
WHILE @ID > 0 BEGIN
   SELECT @SQL = 'CREATE SYNONYM ' + Table_Name + ' FOR ' + @Database + '.' + @Schema + '.' + Table_Name FROM #Tables WHERE TableID = @ID
   PRINT @SQL
   --EXEC sp_executesql @SQL
   SET @ID = @ID - 1
END

Затем запустите ее так:

EXEC SynonymUpdate 'Database' , 'dbo'

Обратите внимание, что вы должны запускать ее как пользователь с привилегией созданиясинонимы.Если вы хотите, чтобы пользователь без этих привилегий запускал его, в SQL 2000 не повезло, в SQL 2005 вы можете поместить в него предложение EXECUTE AS.

3 голосов
/ 25 августа 2010

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

Если это один экземпляр , и обе базы данных на нем - используйте три обозначения имени:

SELECT *
  FROM database1.dbo.table_X
  JOIN database2.dbo.table_Y ...

Если другая база данных существует в отдельном экземпляре SQL Server (в одном блоке может быть несколько SQL Server) или база данных существует в экземпляре SQL Server в другом боксе / виртуальной машине - создайте Linked Сервер экземпляр. Затем вы используете четыре обозначения имени:

SELECT *
  FROM database1.dbo.table_X
  JOIN linked_server_name.database2.dbo.table_Y
...