在删除/替换存储过程之前,我通常会在工作项目中对存储过程的名称进行字符串搜索,以确保没有毫无疑问的代码正在使用它。有没有更好更可靠的方法呢?
答案 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#项目,那很好,但不一定非常可能。
单元测试也是一种很好的技术,可以减轻这种情况下的一些风险。