ren*_*thy 4 sql sql-server sql-server-2008
我有生产数据库(例如PROD1).它与其他数据库有很多同义词(例如PROD2).
我创建PROD2_TEST(作为完整副本PROD2)和PROD1_TEST(作为完整副本PROD1).但结果我有PROD1_TEST同义词PROD2,而不是PROD2_TEST.
如何,我可以自动重新创建测试数据库的所有同义词吗?
根据@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`
出于同样的原因,我不得不这样做,这是我使用的查询.运行查询,将结果复制粘贴到新服务器(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
无法更改同义词,您必须删除并创建它们。以下文章包含一个为一系列表创建同义词的脚本。希望您可以修改它以满足您的需求:
您可以使用该视图查看所有现有同义词sys.synonyms。在伪代码中你想要做的是:
name和base_object_namePROD2为PROD2_TEST| 归档时间: | 
 | 
| 查看次数: | 11455 次 | 
| 最近记录: |