【问题标题】:SQL Server stored procedure being deleted正在删除 SQL Server 存储过程
【发布时间】:2015-01-07 19:03:40
【问题描述】:

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

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

C# 代码中没有DROP。所以我不知道发生了什么。 什么可能会掉线?

【问题讨论】:

  • 您是否有任何级别的镜像或复制设置?
  • 不,我不知道。我只能认为某种类型的 C# 异常正在这样做
  • 您应该查询 SQL Server 上运行的默认跟踪以查看是谁在删除它

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


【解决方案1】:

我认为人们说缺少“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%';

【讨论】:

  • 您的 SELECT 没有返回任何行。我有一个触发器可以捕获所有已执行的 DDL,它只得到了 SA 执行的这个奇怪的 DROP
  • @Mucida 您是否在 proc 正在消失的数据库中运行了 SELECT ?您还可以检查执行数据库更新的脚本,查找正在删除的 proc 的定义,然后查看它的上方以查看它成为了哪些代码的一部分。此外,空格可能会影响搜索结果,因此我将使用新的搜索字符串更新我的答案。
  • 是的,我做到了。最奇怪的是,我们重新创建程序后,客户端可以正常使用系统,但是一整天重复使用同一个程序后,这个程序又“随机”掉了。这就是为什么我猜测 C# 异常正在这样做
  • @Mucida 我看不到异常是如何丢弃 proc 的,除非您将代码放入运行 DROP 的 SqlCommand 的 catch 块内。我还希望您的应用程序没有以“sa”或“sysadmin”角色成员的身份登录数据库。那会很糟糕。稍后我会在我的答案中加入另外 2 个想法。
  • 我找到了 DROP PROC.. 有人在数据库中做了一些更新,这就是为什么我第一次没有看到它的原因。我得到了备份,找到了一个procedure1,最后是drop procedure2
【解决方案2】:

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

然后您可以防止丢弃,除非系统管理员这样做。或者您可以记录它何时被丢弃以及被谁丢弃,这样您就可以研究发生了什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2012-03-15
    • 1970-01-01
    • 2010-09-15
    • 2013-11-07
    相关资源
    最近更新 更多