0

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

 select   column1, column2
 from     OtherDb.SomeSchema.SomeTable    

或者

 exec SOMEOTHERSERVER.OTHERDB.dbo.DOSOMETHING    

并需要将其替换为

 select   column1, column2
 from     dbo.FirstSynonym

 exec  dbo.DoSomethingSynonym

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

谢谢,彼得

4

3 回答 3

0

您可以执行以下操作:

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

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

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

如果需要,您可以添加另一个 REPLACE 来CREATE PROC更改ALTER PROC

于 2011-04-18T17:04:00.723 回答
0

我更喜欢 gbn 的解决方案,但我将描述我是如何解决这项工作的:

  1. 使用 SMO (C#) 迭代过程、视图和 UDF
  2. 对于每个过程,迭代所有同义词(也使用 SMO)
  3. 如果过程脚本包含基础对象名称,请将它们替换为同义词,否则跳过该过程
  4. 仅针对需要更改的过程返回脚本

也可以直接从 C# 为每个编辑的对象执行 alter 脚本,但我更喜欢在执行之前查看脚本。

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

于 2011-04-20T08:29:09.890 回答