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

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

Mary-Kate Olsen
發布: 2025-01-03 13:11:39
原創
900 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板