存储过程随机丢弃

时间:2014-03-19 06:14:52

标签: sql sql-server stored-procedures

我们最近在登台和制作环境中遇到了一个奇怪的问题。我们已经在SQL Server 2005上运行了一个更新脚本到存储过程,验证了新的更改,并开始在我们的产品上使用它。一段时间后,DB中缺少相同的存储过程。除了我们打算使用的任务之外,任何其他任务都不使用此存储过程。我们检查了每一段代码和部署脚本,但是找不到只删除存储过程的跟踪。

此问题不会出现在我们的DEV和QA环境中,而只会出现在暂存和生产环境中。

有人可以为此提供帮助吗?

亲切的问候,

Mafaz

1 个答案:

答案 0 :(得分:4)

如果您排除了明显的(例如故意破坏),那么我建议您查看sys.sql_modules以获取对该程序的参考 - 可能会出现意外滑动:

IF NOT EXISTS (SELECT 1 FROM SYS.PROCEDURES WHERE NAME = 'Proc1')
  DROP PROCEDURE Proc1
GO

CREATE PROC dbo.Proc1
  AS
    ...

<< MISSING GO!

IF NOT EXISTS (SELECT 1 FROM SYS.PROCEDURES WHERE NAME = 'Proc2')
  DROP PROCEDURE Proc2
GO

CREATE PROC dbo.Proc2
  AS
  ...

即。在上面,DROP PROCEDURE Proc2代码附加了 INTO 无关Proc1的定义,因为GO末尾缺少Proc1定义。每次运行Proc1时,它都会删除proc Proc2(如果if exists已被删除,则Proc2将不方便地隐藏错误。

同样,另一个常见问题是将GRANT EXEC留在PROC的底部 - 如果权限不严格,则可能会破坏程序的性能。

这里最好的建议是执行具有最小权限的应用程序,以便它无法执行DDLDROPGRANT。这样,应用程序会在执行Proc1时中断,从而可以快速找到有问题的代码。