代码之家  ›  专栏  ›  技术社区  ›  Ray

SQL Server:是否存在用于执行常规存储过程的等效触发器

  •  2
  • Ray  · 技术社区  · 14 年前

    希望你能帮忙。

    有没有一种方法可以在不改变sp本身的情况下可靠地检测存储过程何时在SQL Server上运行?

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

    我们没有切实可行的方法来改变产品网页中调用报告的部分。我们也无法更改核心产品报告的存储过程。(在每个内部日志的开始/结束处添加一条日志记录线是很简单的)。

    因此,我试图找到的是,在SQL Server(2005/2008)中,是否有一种方法可以在任何其他存储过程运行时执行日志存储过程,而不改变这些存储过程本身。

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

    有人有什么想法吗?是否有一种“存储过程执行触发器”?有没有可以将自定义.NET代码挂接到的SQL Server事件模型? (为了从一开始就打折,我们希望尝试对SQL Server进行更改,而不是从产品网页等捕获正在运行的报表)

    欣赏的想法
    谢谢

    3 回复  |  直到 14 年前
        1
  •  5
  •   Paul Williams    14 年前

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

    例如,打开SQL Server事件探查器。创建所需的跟踪,即包括sp:starting和所需的列。还可以选择将跟踪保存到表中。

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

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

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

    现在,每当SQL Server重新启动时,它都会自动配置跟踪,并且所有的sp调用都会记录到一个表中。

    --编辑——

    还请注意,有些动态管理视图(DMV)对于监视存储过程很有用。两个你可能感兴趣的:

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

        2
  •  2
  •   gbn    14 年前

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

    这就是说,您可以间接但不能100%可靠地监视计划缓存。见 this link . 但是,如果您有重新编译选项,那么在使用后会将其从缓存中删除。另外,在服务器启动后,状态会被重置,您需要运行DMV来查看缓存中的内容。

    这取决于你需要多彻底…

        3
  •  0
  •   Ed B    14 年前

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