正在删除 SQL Server 存储过程

本文关键字:Server 存储过程 SQL 删除 | 更新日期: 2023-09-27 18:36:34

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

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

C# 代码没有DROP。所以我不知道发生了什么。什么会掉落它?

正在删除 SQL Server 存储过程

我认为人们说缺少"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


您还可以检查执行数据库更新的脚本,查找要删除的进程的定义,并查看其上方以查看它成为其中一部分的代码。


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

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

我建议为DROP_PROCEDURE放置一个DDL触发器

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