SQL-Server:是否存在相当于一般存储过程执行的触发器

时间:2010-05-18 15:56:22

标签: sql-server stored-procedures logging triggers execution

希望你能提供帮助。

有没有办法可靠地检测何时在SQL Server上运行存储过程而不改变SP本身?

这是要求。我们需要跟踪从我们的企业数据仓库运行报告的用户,因为我们使用的核心产品不允许这样做。我们添加的核心产品报告和大量内部报告都会从单个存储过程中返回数据。

我们没有切实可行的方法来更改调用报告的产品网页部分。我们也无法更改核心产品报告的存储过程。 (将记录行添加到每个内部的开始/结束都是微不足道的)。

我试图找到的是,SQL Server(2005/2008)中是否有办法在任何其他存储过程运行时执行日志记录存储过程,而不会自行更改这些存储过程。

我们对SQL Server实例本身具有一般控制权,因为它本地,我们只是不想自己更改产品存储过程。

任何人都有任何想法?有没有一种“存储过程执行触发器”?是否有SQL Server的事件模型,我们可以将自定义.Net代码挂钩到? (只是从一开始就打折它,我们想尝试对SQL Server进行更改,而不是从产品网页中捕获正在运行的报告等)

赞赏的意见 感谢

3 个答案:

答案 0 :(得分:5)

您可以设置SQL Server初始化时自动运行的后台跟踪。然后,在跟踪中,您可以将trace语句输出到表。

例如,打开SQL Server Profiler。创建您想要的跟踪,即包括SP:Starting和您想要的列。还可以选择将跟踪保存到表中。

现在,在设置脚本后,选择“文件/导出/脚本跟踪定义”。这将创建一个生成跟踪的SQL语句。

接下来,创建一个使用SQL创建此跟踪的存储过程。在主数据库中安装proc并告诉SQL Server在启动时自动运行它:

exec sp_procoption N'sp_MyProc', N'startup', N'true'

现在,每次SQL Server重新启动时,它都会自动配置跟踪,并且所有SP调用都将记录到表中。

- 编辑 -

另请注意,有一些动态管理视图(DMV)可用于监视存储过程。您可能对以下两个感兴趣:

例如,sys.dm_exec_procedure_stats将告诉您上次运行proc的时间,运行的次数,最长的执行时间等。请注意,这些视图仅影响当前在数据库缓存中的存储过程。如果卸载了proc,那么信息也是如此。

答案 1 :(得分:2)

您只能可靠地使用SQL事件探查器 :没有执行挂钩或“执行触发器”可供使用。

说,你可以间接但不是100%可靠地监控计划缓存。见this link。但是,如果您有OPTION RECOMPILE,则在使用后将其从缓存中删除。此外,在服务器启动后重置统计信息,您需要运行dmv以查看缓存中的内容。

这取决于你需要多彻底......

答案 2 :(得分:0)

您可以使用SQL Log Rescue(免费)等工具查询SQL日志文件 http://www.red-gate.com/products/SQL_Log_Rescue/index.htm 它可以告诉你哪些存储过程已经运行&什么时候。 这是最简单的方法,因为它不涉及修改任何现有代码,也不会增加应用程序的开销。服务器