SQL Server用同义词替换源对象

时间:2011-04-18 13:44:57

标签: sql-server stored-procedures replace synonym

我有大约100到150个存储过程。我需要使用同义词快速更改对所有外部数据库的引用。我有例如我的程序中的这些代码行:

 select   column1, column2
 from     OtherDb.SomeSchema.SomeTable    

 exec SOMEOTHERSERVER.OTHERDB.dbo.DOSOMETHING    

并需要用

替换它
 select   column1, column2
 from     dbo.FirstSynonym

 exec  dbo.DoSomethingSynonym

手动打开所有这些程序会花费我相当多的时间。知道如何快速实现这个目标吗?

谢谢, 彼得

3 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

  • 使用SSMS的Tasks-> Generate Scripts功能生成包含CREATE PROCEDURE语句和所有存储过程代码的文件。
  • 通过搜索/替换或ViEmu功能修改此文件以匹配您所需的状态。
  • 使用“对象资源管理器详细信息窗口”
  • 删除所有现有存储过程
  • 从您生成/修改的文件中重新创建所有内容。
  • (请先在测试环境中测试这样的修改)

答案 1 :(得分:0)

将bcp或sqlcmd与此查询一起使用以生成一系列ALTER

SELECT
    REPLACE(
        REPLACE(definition,
               'SOMEOTHERSERVER.OTHERDB.dbo.DOSOMETHING',
               'dbo.DoSomethingSynonym'
               )
           'OtherDb.SomeSchema.SomeTable',
           'dbo.FirstSynonym'
           ) + '
GO
'
FROM
    sys.sql_modules

如果需要,您可以添加其他替换以将CREATE PROC更改为ALTER PROC

答案 2 :(得分:0)

我更喜欢gbn的解决方案,但我会描述我是如何解决这个问题的:

  1. 使用SMO(C#)
  2. 迭代过程,视图和UDF
  3. 对于每个过程,迭代所有同义词(也使用SMO)
  4. 如果过程脚本包含基础对象名称,请将其替换为同义词,否则请跳过该过程
  5. 仅针对需要更改的程序返回脚本
  6. 也可以直接从C#为每个编辑对象执行alter脚本,但我更喜欢在执行之前看到脚本。

    由于显而易见的原因,当进行替换时,同义词必须按其base_object_name长度按降序排序。