SQL Server 存储过程被删除

Muc*_*ida 0 c# sql-server asp.net stored-procedures

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

我看到很多人说这可能是缺少GObeforeIF EXISTS... DROP PROC语句,但是这个过程并没有在我们运行脚本更新数据库的那一刻消失,而是在用户使用系统时被删除。

DROPC# 代码中没有。所以我不知道发生了什么事。什么可能会掉落它?

Sol*_*zky 5

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

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
Run Code Online (Sandbox Code Playgroud)

在该数据库中查看是否有任何内容出现。

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

// 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
Run Code Online (Sandbox Code Playgroud)

CREATE PROC dbo.SomeProc1因为 the和 the之间没有“GO” IF EXISTS(...SomeProc2),所以 the现在是(在其末尾)IF EXISTS(...SomeProc2)的一部分。SomeProc1每次SomeProc1运行都会掉落SomeProc2


您还可以检查执行数据库更新的脚本,查找正在删除的过程的定义,然后查看其上方以查看它成为了哪些代码的一部分。


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

SELECT *
FROM msdb.dbo.sysjobsteps
WHERE [command] LIKE N'%DROP_%PROC%';
Run Code Online (Sandbox Code Playgroud)