6

本番データベースがあります (例: PROD1)。別のデータベースと同義語がたくさんあります (たとえば、PROD2)。

PROD2_TEST( の完全なコピーとしてPROD2) とPROD1_TEST( の完全なコピーとして) も作成しましPROD1た。しかし、結果として、代わりに ,とPROD1_TEST同義語があります。PROD2PROD2_TEST

すべてのシノニムをテスト データベースに自動的に再作成するにはどうすればよいですか?

4

5 に答える 5

5

同じ理由でこれを行う必要があり、これが私が使用したクエリです。クエリを実行し、結果をコピーして新しいサーバー (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
于 2015-04-22T03:15:26.770 に答える
1

これは、すべてのシノニムを同じサーバー上の新しいデータベースに再マップするために使用したものです(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
于 2014-07-31T10:25:25.960 に答える
1

シノニムを変更することはできません。削除して作成する必要があります。次の記事には、一連のテーブルのシノニムを作成するスクリプトが含まれています。うまくいけば、ニーズに合わせて変更できます。

シノニムを使用して SQL Server オブジェクトを抽象化する

ビューを使用して、既存のシノニムをすべて表示できsys.synonymsます。疑似コードでやりたいことは次のとおりです。

  • シノニムを格納する一時テーブルを作成しnamebase_object_name
  • sys.synonyms から間違ったシノニムをすべて選択して、一時テーブルに入れます。
  • 間違った類義語を削除する
  • シノニムを複製するステートメントを作成しますが、次のように変更PROD2します。PROD2_TEST
  • そのステートメントを実行する
于 2013-10-02T08:50:05.603 に答える