SQL Server存储过程被删除

时间:2015-01-07 19:03:41

标签: c# asp.net sql-server stored-procedures

我有一个存储过程在客户端使用系统时被删除,并且它们无权访问数据库。所以他们无法手动删除它

我看到很多人说在GO语句之前可能缺少IF EXISTS... DROP PROC,但是在我们运行脚本来更新数据库时,这个过程并没有消失,它正在用户使用系统时删除。

C#代码中没有DROP。所以我不知道发生了什么。 有什么可以放弃它?

2 个答案:

答案 0 :(得分:4)

我认为人们说“GO”缺失意味着IF EXISTS DROP现在已嵌入到某个存储过程中。这可以解释为什么它在人们使用系统时消失,而不是在你运行更新脚本时消失(因为IF EXISTS DROP是proc定义的一部分而不能立即运行)。运行以下命令:

SELECT *
FROM sys.sql_modules
WHERE [definition] LIKE N'%DROP_%PROC%';
-- Use _% between the words to account for whitespace variations but still require
-- at least one character

在该数据库中查看是否有任何显示。

为了解释发生了什么,您的脚本如下所示:

// a bunch of SQL statements

GO
IF EXISTS(...SomeProc1)
   DROP PROC dbo.SomeProc1;
GO
CREATE PROC dbo.SomeProc1
AS
 ....

// oops, no GO here

IF EXISTS(...SomeProc2)
   DROP PROC dbo.SomeProc2;
GO
CREATE PROC dbo.SomeProc2
AS
 ....

GO

由于CREATE PROC dbo.SomeProc1IF EXISTS(...SomeProc2)之间没有“GO”,IF EXISTS(...SomeProc2)现在是SomeProc1的一部分(在其末尾)。每次SomeProc1运行时,它都会丢弃SomeProc2


您还可以检查执行数据库更新的脚本,查找正在删除的proc的定义,并查看它上面的内容以查看它成为其中一部分的代码。


您还应检查SQL代理作业,以确保没有嵌入DROP的步骤:

SELECT *
FROM msdb.dbo.sysjobsteps
WHERE [command] LIKE N'%DROP_%PROC%';

答案 1 :(得分:0)

我建议为DROP_PROCEDURE

设置一个DDL触发器

然后你可以防止丢弃,除非系统管理员这样做。或者你可以记录它何时被删除,以及由谁来记录正在发生的事情。