首页 > 数据库 > mysql教程 > 如何记录影响特定表的SQL语句?

如何记录影响特定表的SQL语句?

Mary-Kate Olsen
发布: 2025-01-03 13:11:39
原创
863 人浏览过

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语句执行。

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)
登录后复制

将结果与 DMV 连接以检索有关执行的其他信息:

WITH CapturedResults AS
(
    ...
)
,
StackData AS
(
    ...
)
SELECT ...
FROM StackData AS sd ...
登录后复制

这些方法提供了一种识别正在影响的 SQL 语句的方法该表,让您可以进一步调查并解决任何问题。

以上是如何记录影响特定表的SQL语句?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板