我们最近在登台和制作环境中遇到了一个奇怪的问题。我们已经在SQL Server 2005上运行了一个更新脚本到存储过程,验证了新的更改,并开始在我们的产品上使用它。一段时间后,DB中缺少相同的存储过程。除了我们打算使用的任务之外,任何其他任务都不使用此存储过程。我们检查了每一段代码和部署脚本,但是找不到只删除存储过程的跟踪。
此问题不会出现在我们的DEV和QA环境中,而只会出现在暂存和生产环境中。
有人可以为此提供帮助吗?
亲切的问候,
Mafaz
答案 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
的底部 - 如果权限不严格,则可能会破坏程序的性能。
这里最好的建议是执行具有最小权限的应用程序,以便它无法执行DDL
或DROP
等GRANT
。这样,应用程序会在执行Proc1
时中断,从而可以快速找到有问题的代码。