簡體   English   中英

如何使用擴展事件來跟蹤正在運行的存儲過程中使用的表

[英]How to use extended events to track tables used in stored procedures being run

如何使用擴展事件 (SQL Server 2012) 來告訴我何時在存儲過程中使用了某些表。 我想刪除一些表,所以我想知道使用這些表的存儲過程是否實際上正在運行。

代碼示例設置了支持對象。 並創建一個 session ,我希望它可以工作但沒有。 當您運行這些存儲過程( ListEmpListProd )時,我希望它們被拾起,因為它們包含我正在跟蹤的表( EmployeesProducts )。

注意,我也嘗試使用sp_statement_starting事件:

-- setup supporting objects
CREATE TABLE Employees (Col1 VARCHAR(10));
CREATE TABLE Products (Col1 VARCHAR(10));
GO

INSERT INTO Employees(Col1) VALUES ('Bob');
INSERT INTO Products(Col1) VALUES ('Bolts');
GO

CREATE PROCEDURE ListEmp 
AS 
    SELECT * FROM Employees;
GO

CREATE PROCEDURE ListProd 
AS 
    SELECT * FROM Products;
GO

-- create extended event (that is not doing what I want)
CREATE EVENT SESSION XE_TrackEmployeesAndProductsTables
ON SERVER
ADD EVENT sqlserver.sp_statement_completed
(
    SET collect_statement=1
    ACTION
        (
            sqlserver.database_name,
            sqlserver.sql_text
        )
    WHERE
        (
            sqlserver.like_i_sql_unicode_string(sqlserver.sql_text,N'%Employees%')
            OR sqlserver.like_i_sql_unicode_string(sqlserver.sql_text,N'%Products%')
        )
);
ALTER EVENT SESSION XE_TrackEmployeesAndProductsTables ON SERVER STATE=START;
GO

-- run procs that I want to be picked up by my session (but aren't)
EXEC ListEmp; 
EXEC ListProd;


-- cleanup
DROP EVENT SESSION XE_TrackEmployeesAndProductsTables ON SERVER;
DROP PROC ListEmp;
DROP PROC ListProd;
DROP TABLE Employees;
DROP TABLE Products;

我只需將其添加到您要跟蹤的任何存儲過程的開頭:

declare @msg nvarchar(128) = concat('Stored proc ',OBJECT_NAME(@@PROCID),' run.')
EXEC master..sp_trace_generateevent  @event_class = 82, @userinfo = @msg;  

您可以使用 XEvent session 跟蹤,如下所示:

CREATE EVENT SESSION [UserEvent] ON SERVER 
ADD EVENT sqlserver.user_event
ADD TARGET package0.event_file(SET filename=N'UserEvent')

您可以像這樣識別引用 static SQL 中的表的所有過程:

select distinct object_name(d.object_id) referencing_object, SCHEMA_NAME(o.schema_id) referencing_object_schema
from sys.sql_dependencies d
join sys.objects o
  on o.object_id = d.object_id
where d.referenced_major_id = object_id('Sales.SalesOrderHeader')
  and o.type = 'P'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM