SQL 服务器存储过程被删除
SQL Server stored procedure being deleted
我有一个存储过程在客户使用系统时被删除,他们无权访问数据库。所以他们无法手动删除它
看到很多人说可能是在IF EXISTS... DROP PROC
之前少了一个GO
语句,但是在我们运行脚本更新数据库的那一刻,这个过程并没有消失,它正在用户使用系统时被删除。
C#代码处没有DROP
。所以我不知道发生了什么。
什么可能会掉落它?
我建议为 DROP_PROCEDURE
设置一个 DDL 触发器
那么你可以防止掉线,除非是系统管理员做的。或者您可以记录它何时被丢弃以及被谁丢弃,以便您可以研究正在发生的事情。
我认为人们说缺少 "GO" 意味着 IF EXISTS DROP
现在嵌入到某个存储过程中。这可以解释为什么它会在人们使用系统时消失,而不是在您 运行 更新脚本时消失(因为 IF EXISTS DROP
是 proc 定义的一部分,而不是立即 运行nable)。 运行 以下:
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.SomeProc1
和 IF EXISTS(...SomeProc2)
之间没有 "GO",所以 IF EXISTS(...SomeProc2)
现在是 SomeProc1
的一部分(在它的末尾) ).每SomeProc1
运行s,会掉落SomeProc2
.
您还可以检查执行数据库更新的脚本,查找正在删除的过程的定义,并在其上方查看它成为了哪些代码的一部分。
您还应该检查您的 SQL 代理作业,以确保没有包含嵌入式 DROP 的步骤:
SELECT *
FROM msdb.dbo.sysjobsteps
WHERE [command] LIKE N'%DROP_%PROC%';
我有一个存储过程在客户使用系统时被删除,他们无权访问数据库。所以他们无法手动删除它
看到很多人说可能是在IF EXISTS... DROP PROC
之前少了一个GO
语句,但是在我们运行脚本更新数据库的那一刻,这个过程并没有消失,它正在用户使用系统时被删除。
C#代码处没有DROP
。所以我不知道发生了什么。
什么可能会掉落它?
我建议为 DROP_PROCEDURE
设置一个 DDL 触发器那么你可以防止掉线,除非是系统管理员做的。或者您可以记录它何时被丢弃以及被谁丢弃,以便您可以研究正在发生的事情。
我认为人们说缺少 "GO" 意味着 IF EXISTS DROP
现在嵌入到某个存储过程中。这可以解释为什么它会在人们使用系统时消失,而不是在您 运行 更新脚本时消失(因为 IF EXISTS DROP
是 proc 定义的一部分,而不是立即 运行nable)。 运行 以下:
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.SomeProc1
和 IF EXISTS(...SomeProc2)
之间没有 "GO",所以 IF EXISTS(...SomeProc2)
现在是 SomeProc1
的一部分(在它的末尾) ).每SomeProc1
运行s,会掉落SomeProc2
.
您还可以检查执行数据库更新的脚本,查找正在删除的过程的定义,并在其上方查看它成为了哪些代码的一部分。
您还应该检查您的 SQL 代理作业,以确保没有包含嵌入式 DROP 的步骤:
SELECT *
FROM msdb.dbo.sysjobsteps
WHERE [command] LIKE N'%DROP_%PROC%';