首页 >数据库 >mysql教程 >如何记录修改 SQL Server 中特定表的 SQL 语句?

如何记录修改 SQL Server 中特定表的 SQL 语句?

Barbara Streisand
Barbara Streisand原创
2025-01-03 09:58:391029浏览

How Can I Log SQL Statements That Modify a Specific Table in SQL Server?

创建触发器来记录影响表的 SQL

要跟踪修改特定表的 SQL 语句,您可以创建触发器在那张桌子上。此触发器可以捕获触发更改的 SQL 查询。

触发器代码:

CREATE TRIGGER [dbo].[TriggerName] ON [dbo].[TableName]
AFTER UPDATE
AS
BEGIN
    DECLARE @SQL NVARCHAR(MAX);
    SET @SQL = (SELECT TOP 1 text FROM sys.dm_exec_query_stats WHERE execution_count = 1 AND plan_handle = CONTEXT_INFO());
    INSERT INTO [dbo].[LogTable] (SQLText, TableName, UpdateDate) VALUES (@SQL, OBJECT_SCHEMA_NAME(OBJECT_ID), GETDATE());
END

执行 SQL 的过程:

要执行触发触发器的 SQL 查询,请创建一个过程:如下:

CREATE PROCEDURE [dbo].[UpdateProcedure]
AS
BEGIN
    UPDATE [dbo].[TableName] SET ColumnName = 'UpdatedValue' WHERE Condition;
END

使用触发器:

创建触发器和过程后,您可以使用以下步骤来记录影响表的 SQL:

  1. 创建一个表来存储日志信息:
CREATE TABLE [dbo].[LogTable] (
    ID INT IDENTITY(1,1) PRIMARY KEY,
    SQLText NVARCHAR(MAX),
    TableName NVARCHAR(128),
    UpdateDate DATETIME
);
  1. 执行更新过程:
EXEC [dbo].[UpdateProcedure];
  1. 查看LogTable,查看捕获的SQL语句及其他相关信息到更新操作。

使用替代方法XEvents:

或者,您可以使用 SQL Server 扩展事件来捕获修改特定表的 SQL 语句。与触发器相比,这提供了更详细的信息和灵活性。

设置:

  1. 声明一个变量来捕获执行上下文:
DECLARE @ContextID NVARCHAR(1024);
  1. 为目标上的 sql_statement_completed 事件启用 XEvent 跟踪表:
ALTER DATABASE [TestDB] SET ENABLE_XEVENT = ON;
EXEC sp_trace_create @trace_id = 1, @name = 'CaptureTableModifications', @destination = 4;
EXEC sp_trace_setevent 1, 24, 1;
EXEC sp_trace_setfilter 1, @columnname = 'object_id', @value = OBJECT_ID([dbo].[TableName]);
  1. 开始跟踪:
EXEC sp_trace_start 1;
  1. 执行更新操作。
  2. 停止跟踪:
EXEC sp_trace_stop 1;
  1. 查询XEvent 跟踪:
SELECT session_id, session_nt_address, text 
FROM sys.fn_xe_file_target_read_file('c:\Temp\trace.xel', 'c:\Temp\trace.xem', NULL, NULL);

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn