首頁 >資料庫 >mysql教程 >如何記錄影響特定表的SQL語句?

如何記錄影響特定表的SQL語句?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-03 13:11:39929瀏覽

How Can I Log the SQL Statements Affecting a Specific Table?

建立觸發器來記錄影響表的SQL

當面對表更新來源未知的情況時,它就變得至關重要找出罪魁禍首。為此,您可以在受影響的表上建立觸發器來捕獲觸發更新的已執行 SQL。本文示範了解決此問題的兩種方法:使用簡單的 SQL 觸發器和使用 SQL Server 2008 擴充事件的更全面的解決方案。

SQL 觸發器方法:

建立一個在相關表上觸發,執行預存程序來記錄觸發更新的 SQL 語句。

CREATE TRIGGER [triggerName] ON [tableName]
AFTER UPDATE
AS
BEGIN
    EXEC [storedProcedureName]
END

在儲存中過程,使用sp_WhoIsActive 記錄SQL 語句:

CREATE PROCEDURE [storedProcedureName]
AS
BEGIN
    DECLARE @sql_statement NVARCHAR(MAX)

    EXEC sp_WhoIsActive @output_text = @sql_statement OUTPUT
END

擴充事件方法(SQL Server 2008):

擴充事件方法(SQL Server 2008):

CREATE EVENT SESSION [sessionName] ON SERVER
ADD EVENT sqlserver.sql_statement_completed(
    ACTION (package0.callstack, sqlserver.session_id, sqlserver.sql_text, sqlserver.tsql_stack)
    WHERE (object_id = ' + CAST(OBJECT_ID('[affectedTable]') AS VARCHAR(10)) + ')
)
ADD TARGET package0.asynchronous_file_target
(set filename = 'path\to\filename.xel', metadatafile = 'path\to\filename.xem')
ALTER EVENT SESSION [sessionName] ON SERVER STATE = START

此方法涉及建立捕獲詳細資訊的擴展事件會話關於SQL語句執行。

EXEC sp_executesql 'ALTER EVENT SESSION [sessionName] ON SERVER STATE = STOP'

SELECT CONVERT(XML, event_data) AS data
FROM sys.fn_xe_file_target_read_file('path\to\filename.xel', 'path\to\filename.xem', NULL, NULL)

執行更新後,停止會話並解析捕獲的資料檢索 SQL 語句。

WITH CapturedResults AS
(
    ...
)
,
StackData AS
(
    ...
)
SELECT ...
FROM StackData AS sd ...

將結果與DMV 連接以檢索有關執行的其他資訊:

這些方法提供了一種識別正在影響的SQL 語句的方法該表,讓您可以進一步調查並解決任何問題。

以上是如何記錄影響特定表的SQL語句?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn