本番データベースがあります (例: PROD1
)。別のデータベースと同義語がたくさんあります (たとえば、PROD2
)。
PROD2_TEST
( の完全なコピーとしてPROD2
) とPROD1_TEST
( の完全なコピーとして) も作成しましPROD1
た。しかし、結果として、代わりに ,とPROD1_TEST
同義語があります。PROD2
PROD2_TEST
すべてのシノニムをテスト データベースに自動的に再作成するにはどうすればよいですか?
本番データベースがあります (例: PROD1
)。別のデータベースと同義語がたくさんあります (たとえば、PROD2
)。
PROD2_TEST
( の完全なコピーとしてPROD2
) とPROD1_TEST
( の完全なコピーとして) も作成しましPROD1
た。しかし、結果として、代わりに ,とPROD1_TEST
同義語があります。PROD2
PROD2_TEST
すべてのシノニムをテスト データベースに自動的に再作成するにはどうすればよいですか?
同じ理由でこれを行う必要があり、これが私が使用したクエリです。クエリを実行し、結果をコピーして新しいサーバー (PROD_Test) に貼り付け、生成されたクエリを実行します。使用している場合に備えて、異なるスキーマ名と複数のデータベースを処理します。
SELECT 'Drop Synonym [' + SCHEMA_NAME(schema_id) + '].[' + PARSENAME(base_object_name,1) + '];CREATE SYNONYM [' +
SCHEMA_NAME(schema_id) + '].[' + PARSENAME(base_object_name,1) + '] FOR [' + COALESCE(PARSENAME(base_object_name,3),DB_NAME(DB_ID())) + '_Test].['
+ COALESCE(PARSENAME(base_object_name,2),SCHEMA_NAME(SCHEMA_ID())) + '].[' + PARSENAME(base_object_name,1) + '];'
FROM sys.synonyms
これは、すべてのシノニムを同じサーバー上の新しいデータベースに再マップするために使用したものです(Tobseyの提案に基づく)
SET NOCOUNT ON;
DECLARE @db_name SYSNAME
DECLARE @schema_name SYSNAME
DECLARE @cmd NVARCHAR(256)
SET @schema_name = N'dbo'
SET @db_name = N'[newdb]'
DECLARE @schema_id INT
SELECT @schema_id = schema_id
FROM sys.schemas
WHERE NAME = @schema_name;
DECLARE @table_list TABLE (table_name SYSNAME,dest_table_name sysname,dest_schema_name sysname)
DECLARE @table_name SYSNAME
declare @dest_table_name sysname
declare @dest_schema_name sysname
DECLARE @prefix NVARCHAR(50)
DECLARE @synonym SYSNAME
DECLARE @linked_server SYSNAME
SET @linked_server = N'SERVER'
-- create a synonym for these tables (insert each table)
INSERT INTO @table_list (table_name,dest_table_name,dest_schema_name)
SELECT name
,'['+SUBSTRING(name,CHARINDEX('.',name,CHARINDEX('.',name,0)+1)+1,LEN(name)-CHARINDEX('.',name,CHARINDEX('.',name,0)+1))+']'
,SUBSTRING(name,CHARINDEX('.',name,0)+1,CHARINDEX('.',name,CHARINDEX('.',name,0)+1)-CHARINDEX('.',name,0)-1)
FROM sys.synonyms
WHERE base_object_name LIKE '![SERVER!].![olddb!]%' ESCAPE ('!')
ORDER BY name
IF EXISTS (
SELECT *
FROM sys.servers
WHERE NAME = @linked_server
)
-- 4 part name
SET @prefix = @linked_server + N'.' + @db_name
ELSE
-- 3 part name
SET @prefix = @db_name
SELECT TOP 1 @table_name = table_name,@dest_table_name = dest_table_name,@dest_schema_name=dest_schema_name
FROM @table_list
WHILE @table_name IS NOT NULL
BEGIN
-- set the schema and name for the synonym
SET @synonym = @schema_name+ N'.' + '['+@table_name+']'
-- delete the synonym if it exists
IF EXISTS (
SELECT *
FROM sys.synonyms
WHERE NAME = @table_name
AND schema_id = @schema_id
)
BEGIN
SET @cmd = N'drop synonym ' + @synonym
PRINT @cmd
--EXEC sp_executesql @cmd
END
-- create the synonym
SET @cmd = N'create synonym ' + @synonym + N' for ' + @prefix + N'.'+ @dest_schema_name + N'.'+ @dest_table_name
PRINT @cmd
--EXEC sp_executesql @cmd
PRINT 'GO'
DELETE TOP (1)
FROM @table_list
SET @table_name = NULL
SELECT TOP 1 @table_name = table_name,@dest_table_name = dest_table_name,@dest_schema_name=dest_schema_name
FROM @table_list
END
GO
シノニムを変更することはできません。削除して作成する必要があります。次の記事には、一連のテーブルのシノニムを作成するスクリプトが含まれています。うまくいけば、ニーズに合わせて変更できます。
シノニムを使用して SQL Server オブジェクトを抽象化する
ビューを使用して、既存のシノニムをすべて表示できsys.synonyms
ます。疑似コードでやりたいことは次のとおりです。
name
、base_object_name
PROD2
します。PROD2_TEST