C# 正在删除SQL Server存储过程

C# 正在删除SQL Server存储过程,c#,asp.net,sql-server,stored-procedures,C#,Asp.net,Sql Server,Stored Procedures,我有一个存储过程,在客户端使用系统时被删除,而他们没有访问数据库的权限。所以他们无法手动删除它 我看到很多人说如果存在的话,这可能是一次错过的尝试。。。DROP PROC语句,但在我们运行脚本更新数据库时,此过程并没有消失,而是在用户使用系统时将其删除 C代码没有下降。所以我不知道发生了什么。 什么可以删除它?我建议为DROP\u过程设置DDL触发器 然后,除非系统管理员执行此操作,否则您可以阻止删除。或者你可以记录下它被丢弃的时间和被丢弃的人,这样你就可以研究发生了什么 我建议为DROP_程序

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

我看到很多人说如果存在的话,这可能是一次错过的尝试。。。DROP PROC语句,但在我们运行脚本更新数据库时,此过程并没有消失,而是在用户使用系统时将其删除

C代码没有下降。所以我不知道发生了什么。
什么可以删除它?

我建议为DROP\u过程设置DDL触发器


然后,除非系统管理员执行此操作,否则您可以阻止删除。或者你可以记录下它被丢弃的时间和被丢弃的人,这样你就可以研究发生了什么

我建议为DROP_程序设置DDL触发器


然后,除非系统管理员执行此操作,否则您可以阻止删除。或者你可以记录下它被丢弃的时间和被丢弃的人,这样你就可以研究发生了什么

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

挑选* 从sys.sql\u模块 其中[definition]类似于N'%DROP_uu%PROC%'; -在单词之间使用%来说明空格的变化,但仍然需要 -至少一个字符 在数据库中查看是否有任何显示

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

//一堆SQL语句 去 如果存在…SomeProc1 DROP PROC dbo.SomeProc1; 去 创建PROC dbo.SomeProc1 像 .... //哎呀,不行,到这儿来 如果存在…SomeProc2 DROP PROC dbo.SomeProc2; 去 创建PROC dbo.SomeProc2 像 .... 去 由于CREATE PROC dbo.SomeProc1和IF EXISTS…SomeProc2之间没有连接,因此IF EXISTS…SomeProc2现在是SomeProc1末尾的一部分。每次运行SomeProc1时,它都会删除SomeProc2

您还可以检查执行数据库更新的脚本,查找正在删除的进程的定义,并查看它上面的代码,查看它成为了什么代码的一部分

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

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

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

挑选* 从sys.sql\u模块 其中[definition]类似于N'%DROP_uu%PROC%'; -在单词之间使用%来说明空格的变化,但仍然需要 -至少一个字符 在数据库中查看是否有任何显示

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

//一堆SQL语句 去 如果存在…SomeProc1 DROP PROC dbo.SomeProc1; 去 创建PROC dbo.SomeProc1 像 .... //哎呀,不行,到这儿来 如果存在…SomeProc2 DROP PROC dbo.SomeProc2; 去 创建PROC dbo.SomeProc2 像 .... 去 由于CREATE PROC dbo.SomeProc1和IF EXISTS…SomeProc2之间没有连接,因此IF EXISTS…SomeProc2现在是SomeProc1末尾的一部分。每次运行SomeProc1时,它都会删除SomeProc2

您还可以检查执行数据库更新的脚本,查找正在删除的进程的定义,并查看它上面的代码,查看它成为了什么代码的一部分

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

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

您有任何级别的镜像或复制设置吗?没有。我只能认为某种类型的C异常正在执行此操作。您应该查询SQL server上运行的默认跟踪,以查看谁正在删除它。您是否有任何级别的镜像或复制设置?不,我没有。我只能认为某种类型的C异常正在执行此操作。您应该查询SQL server上运行的默认跟踪,看看是谁在删除它。您的选择没有返回任何行。我有一个触发器,它捕获所有被执行的DDL,它只得到由SA@Mucida您是否在proc从中消失的数据库中运行SELECT?您还可以检查执行数据库更新的脚本,查找正在删除的进程的定义,并查看它上面的代码,查看它成为了什么代码的一部分。此外,空格可能会影响搜索结果,因此我将使用新的搜索字符串更新我的答案。是的,我这样做了。最棘手的是,在我们重新创建过程后,客户端可以正常使用系统,但在整天重复使用相同的过程后,该过程会再次随机退出。这就是为什么我认为C是一个例外
他正在做什么it@Mucida我看不出异常是如何删除proc的,除非您将代码放在catch块中运行DROP的SqlCommand中。我还希望您的应用程序不是以sa或sysadmin角色成员的帐户身份登录数据库。那太糟糕了。我会在我的答案中加入另外两个想法。我找到了DROP程序。。有人更新了数据库,这就是为什么我第一次没有看到它。我得到了备份,在末尾发现了一个带有drop procedure2的procedure1。您的选择没有返回任何行。我有一个触发器,它捕获所有被执行的DDL,它只得到由SA@Mucida您是否在proc从中消失的数据库中运行SELECT?您还可以检查执行数据库更新的脚本,查找正在删除的进程的定义,并查看它上面的代码,查看它成为了什么代码的一部分。此外,空格可能会影响搜索结果,因此我将使用新的搜索字符串更新我的答案。是的,我这样做了。最棘手的是,在我们重新创建过程后,客户端可以正常使用系统,但在整天重复使用相同的过程后,该过程会再次随机退出。这就是为什么我猜想C异常正在做的事情it@Mucida我看不出异常是如何删除proc的,除非您将代码放在catch块中运行DROP的SqlCommand中。我还希望您的应用程序不是以sa或sysadmin角色成员的帐户身份登录数据库。那太糟糕了。我会在我的答案中加入另外两个想法。我找到了DROP程序。。有人更新了数据库,这就是为什么我第一次没有看到它。我得到了备份,最后找到了一个带有drop procedure2的过程1