【问题标题】:Possible to shadow/override a SQL Server stored procedure可以隐藏/覆盖 SQL Server 存储过程
【发布时间】:2014-01-07 19:28:29
【问题描述】:

在 SQL Server 中是否有任何内置方法可以覆盖单个事务的现有存储过程?

假设我有一个存储过程

prc_GetValidUsers
@param1 int
 ...
 INSERT INTO *
........prc_GetIdFromString param3
...
...

单个事务是否可以重新定义 prc_GetIdFromString 是别的东西?还是不可能做到这一点?

【问题讨论】:

  • 为什么不在你的 sp 中使用一个参数并根据该参数创建另一个表的路径?
  • 我正在尝试对 prc_GetValidUsers 进行单元测试,但 prc_GetIdFromString 是一个巨大的函数,它引用了许多表,并且是遗留代码的一部分。由于它是用于测试目的,我不想只为测试添加任何代码,但我也不想在所有这些表中创建数据来测试一个小功能。
  • 在测试中,创建dbo.prc_TestGetIdFromString,去掉所有多余的代码。请改为调用此 SP。在数据库中没有像override这样的面向对象的概念。如果您想花哨,请创建一个模式 [test]。然后你可以调用 test.prc_GetIdFromString 而不是 dbo.prc_TestGetIdFromString ...
  • 就个人而言,我从来没有在没有测试参数的 proc 中创建任何复杂的东西,如果它设置为测试模式则回滚。当您使 proc 工作或更改它时,没有必要将 gbad 数据放入数据库。如果你把它作为最后一个参数并给它一个默认值 0(非测试模式),那么你甚至不必更改应用程序中任何现有的 proc 调用。

标签: sql-server tsql stored-procedures overriding


【解决方案1】:

如果您使用的是 SQL Server 2005 或更高版本,则可以使用 SYNONYM 在运行时指向正确的代码。这将需要将现有代码移动到具有新名称的 SP - 因此 SYNONYM 可以具有原始 SP 的名称(因此不需要更改引用原始 SP 的所有内容)。您还需要创建另一个 SP 来执行所需的简化功能。然后可以将SYNONYM 指向您要运行的 SP。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    相关资源
    最近更新 更多