有没有办法重新编译或至少“检查编译”存储过程?有时我们会进行架构更改 - 添加或删除列等。并尽最大努力识别受影响的触发器,但只会被我们错过的触发器触发,这会在下一次运行时发挥作用。 SQLServer 2k5或2k8。
答案 0 :(得分:5)
我理解你的问题为'当我进行架构更改时,我想验证它们仍然使用新架构正确执行的所有过程'。 IE浏览器。如果删除过程中SELECT中引用的列,则需要将其标记为需要更改。所以具体来说,我不明白你的问题是“我希望程序在下次执行时重新编译”,因为引擎会为你完成这项工作,它将检测与任何模式更改相关的元数据版本更改并丢弃现有的缓存执行计划。
我的第一个观察是,您在问题中描述的内容通常是 TEST 的工作,您应该在部署过程中执行QA步骤来验证新的“构建”。您可以拥有的最佳解决方案是在测试部署中实现一组最小的单元测试,这些测试至少会遍历所有存储过程并验证每个存储过程的执行的正确性。这几乎可以消除所有的惊喜,至少在它受到伤害的地方消除它们(在生产中或在客户现场)。
您的下一个最佳选择是依靠您的开发工具来跟踪这些依赖关系。 Visual Studio Database 2008 Database Edition提供了开箱即用的此类功能,它将负责验证您在架构中所做的任何更改。
最后你的最后一个选择是做一些类似于KM建议的事情:根据修改后的对象自动迭代所有程序(以及依赖于依赖等等的所有程序,等等,递归)。标记重新编译的过程是不够的,你真正需要的是运行ALTER PROCEDURE来触发其文本的解析和模式的验证(T-SQL与你的通常语言有些不同)编译/执行循环,'编译'本身只在程序实际执行时才会发生)。您可以首先遍历sys.sql_dependencies
以查找已更改对象的所有依赖项,还可以从sys.sql_modules
中找到依赖项的“模块定义”:
with cte_dep as (
select object_id
from sys.sql_dependencies
where referenced_major_id = object_id('<your altered object name>')
union all
select d.object_id
from sys.sql_dependencies d
join cte_dep r on d.referenced_major_id = r.object_id
)
, cte_distinct as (
select distinct object_id
from cte_dep)
select object_name(c.object_id)
, c.object_id
, m.definition
from cte_distinct c
join sys.sql_modules m on c.object_id = m.object_id
然后,您可以运行依赖的“模块”并重新创建它们(即删除它们并运行“定义”中的代码)。请注意,“模块”比存储过程更通用,还包括视图,触发器,函数,规则,默认值和复制过滤器。加密的“模块”将无法定义可用的定义,并且绝对正确您还必须考虑sys.sql_modules
中捕获的各种设置(ansi nulls,schema binding,execute as clauses等)。
如果使用ynamic SQL,则无法验证。它不会被sys.sql_dependencies
捕获,也不会通过“重新创建”模块来验证。
总体而言,我认为您的最佳选择是实施单元测试验证。
答案 1 :(得分:4)
如果您在更改表格和破坏存储过程时遇到问题,请尝试 sp_depends :
sp_depends [ @objname = ] '<object>'
<object> ::=
{
[ database_name. [ schema_name ] . | schema_name.
object_name
}
在他们休息之前识别他们。以这种方式使用它:
EXECUTE sp_depends YourChangedTableName
此外,您可以使用 sp_recompile :
EXEC sp_recompile YourChangedTable
但这只标记了下次运行时重新编译的相关存储过程。
您可以使用management studio或源代码控制将所有过程的连接创建脚本生成到单个文件中,然后运行该脚本。
答案 2 :(得分:3)
我知道你的意思,在很多场景中我都知道你的需要。您可以查看sp_refreshsqlmodule。
祝你好运,罗恩答案 3 :(得分:1)
从sysobjects
获取列表后,只需迭代它们,然后运行sp_recompile
:
以下是显示示例脚本的链接:
http://database.ittoolbox.com/groups/technical-functional/sql-server-l/recompile-all-stored-procedures-2764478
答案 4 :(得分:1)
您可以使用DBCC FREEPROCCACHE