将所有同义词更改为另一个数

ren*_*thy 4 sql sql-server sql-server-2008

我有生产数据库(例如PROD1).它与其他数据库有很多同义词(例如PROD2).

我创建PROD2_TEST(作为完整副本PROD2)和PROD1_TEST(作为完整副本PROD1).但结果我有PROD1_TEST同义词PROD2,而不是PROD2_TEST.

如何,我可以自动重新创建测试数据库的所有同义词吗?

kuk*_*lei 7

根据@artm的建议,我稍微扩展了它,以包含参数,使其更通用.这是代码

DECLARE @newDB VARCHAR(MAX) = 'newDB',  --newDB to point the synonym to
    @linkedSrv VARCHAR(MAX) = null --if the synonym points to a linked server than specify it here like '[LinkedSrv].' (including the dot in the end)

SELECT  'Drop Synonym [' + SCHEMA_NAME(schema_id) + '].[' + PARSENAME(base_object_name, 1) + '];' AS dropSynonym,
        ' CREATE SYNONYM [' + SCHEMA_NAME(schema_id) + '].[' + UPPER(PARSENAME(base_object_name, 1)) + '] FOR '
        + COALESCE(@linkedSrv, '') + '[' + @newDB + '].[' + COALESCE(PARSENAME(base_object_name, 2),
                                                                     SCHEMA_NAME(SCHEMA_ID())) + '].['
        + UPPER(PARSENAME(base_object_name, 1)) + '];' AS createSynonym
FROM    sys.synonyms`
Run Code Online (Sandbox Code Playgroud)


art*_*rtm 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
Run Code Online (Sandbox Code Playgroud)


Tob*_*sey 1

无法更改同义词,您必须删除并创建它们。以下文章包含一个为一系列表创建同义词的脚本。希望您可以修改它以满足您的需求:

使用同义词来抽象 SQL Server 对象

您可以使用该视图查看所有现有同义词sys.synonyms。在伪代码中你想要做的是:

  • 创建一个临时表来存储同义词namebase_object_name
  • 从 sys.synonyms 中选择所有不正确的同义词到临时表中
  • 删除不正确的同义词
  • 构造语句来复制同义词,但更改PROD2PROD2_TEST
  • 运行该语句