代码之家  ›  专栏  ›  技术社区  ›  Peter Radocchia

在SQL Server中捕获执行时的对象依赖关系

  •  3
  • Peter Radocchia  · 技术社区  · 14 年前

    例如,以动态SQL场景为例:

    DECLARE @table SYSNAME = 'SomeTable'
    DECLARE @column SYSNAME = 'SomeColumn'
    DECLARE @proc SYSNAME
    DECLARE @command NVARCHAR(MAX) = 'SELECT TOP 1 @proc = '+@column+' FROM '+@table
    EXEC sp_executesql @command, N'@proc SYSNAME OUTPUT', @proc OUTPUT
    EXEC @proc
    

    执行时间依赖关系将是 SomeTable sp_executesql ,的值 @proc ,以及引用的任何对象 在运行时 通过@proc程序。

    • 从中获取xml查询计划sys.dm\u exec\u query\u计划并通过ServiceBroker将其传递给另一个进程进行处理。优点:我认为它可能真的有用。缺点:潜在的昂贵和侵入性:必须对每个批处理和执行级别进行改造,以捕获查询计划。

    理想情况下,捕获工作如下:

    DECLARE @guid UNIQUEIDENTIFIER
    EXEC usp_begin_object_capture @guid OUTPUT
    
    DECLARE @table SYSNAME = 'SomeTable'
    DECLARE @column SYSNAME = 'SomeColumn'
    DECLARE @proc SYSNAME
    DECLARE @command NVARCHAR(MAX) = 'SELECT TOP 1 @proc = '+@column+' FROM '+@table
    EXEC sp_executesql @command, N'@proc SYSNAME OUTPUT', @proc OUTPUT
    EXEC @proc
    
    EXEC usp_stop_object_capture @guid
    
    SELECT object_name FROM object_capture_table WHERE guid = @guid
    
    ------------------------------
    object_name 
    ------------------------------
    SomeTable
    sp_executesql
    <proc_named_by_@proc>
    <object1_referenced_by_@proc>
    <object2_referenced_by_@proc>
    <object3_referenced_by_@proc>
    <objectn_referenced_by_@proc>
    

    上下文:

    我正在尝试缓存/记忆长时间运行过程的确定结果集。底层数据是相当静态的。如果我可以在执行时收集实际的依赖关系,我就可以自动将缓存中的条目与一组对象关联起来。如果这些对象中的任何一个发生了变化,我就知道哪些条目要作废。

    有什么想法吗?非常感谢。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Remus Rusanu    14 年前

    Query Notifications ? 缓存/记忆查询结果,并在结果发生更改时让SQL Server本身通知您。

        2
  •  0
  •   Peter Radocchia    14 年前

    [回答我自己的问题……]

    sp_trace_create .

    使用事件114,“审核架构对象访问事件”。

    包括列 DatabaseName ParentName ObjectName ServerName .

    SPID .