删除SQL Server中的存储过程

时间:2009-08-20 16:17:16

标签: c# sql-server stored-procedures visual-studio-2008

在删除/替换存储过程之前,我通常会在工作项目中对存储过程的名称进行字符串搜索,以确保没有毫无疑问的代码正在使用它。有没有更好更可靠的方法呢?

6 个答案:

答案 0 :(得分:5)

对于SQL Server 2005及更高版本,使用更长的代码。

SELECT
    OBJECT_NAME(object_id)
FROM
    sys.sql_modules
WHERE
    definition LIKE '%' + 'mySP' + '%'

答案 1 :(得分:3)

或重命名sp而不是删除它。如果有一个身份不明的依赖,你可以迅速恢复你的sp。

您可以做的另一件事是编写视图,函数和sps脚本,然后搜索脚本。再次,不会捕获动态sql,但可能会捕获一些额外的引用。

答案 2 :(得分:2)

如果您有一套全面的单元测试,请删除SP并运行测试以查看是否有任何中断。如果你没有套房,就没时间开始写它了。

答案 3 :(得分:1)

我有这个代码用于在所有触发器上搜索文本(有点苛刻,抱歉),也许你可以调整它以搜索其他数据库对象:

SELECT  Tables.Name TableName,
        Triggers.name TriggerName,
        Triggers.crdate TriggerCreatedDate,
        Comments.Text TriggerText
FROM sysobjects Triggers
    Join sysobjects Tables On Triggers.parent_obj = Tables.id
    Join syscomments Comments On Triggers.id = Comments.id
WHERE
    Triggers.xtype = 'TR'
AND Tables.xtype = 'U'
AND (@ttable_name = '' OR Tables.name = @table_name)
AND Comments.Text LIKE '%' + @search + '%'
ORDER BY Tables.Name, Triggers.name

答案 4 :(得分:1)

使用sys.sql_dependencies目录视图,您应该在删除它之前搜索

select object_name(object_id), *
    from sys.sql_dependencies
    where referenced_major_id = object_id('<nameofproceduretobedropped>');

这会捕获其他过程中对该过程的所有引用,但它无法捕获动态sql依赖项。

使用存储过程虽然大多数依赖项是外部的,即。在客户端代码中。

答案 5 :(得分:1)

理想情况下,在您的C#代码中,您只有一个(概念上)“允许”调用存储过程的方法,并且该方法必须存在于数据访问层中(唯一允许访问数据库的层)连接字符串)。

在C#级别实际强制执行此类操作的能力非常缺乏。它通常必须通过编码约定和代码审查来实施。

此时,通过C#代码进行字符串搜索可能是您唯一的选择,我同意这不是一个很好的选择。如果您可以将字符串搜索限制为单个C#项目,那很好,但不一定非常可能。

单元测试也是一种很好的技术,可以减轻这种情况下的一些风险。