建立觸發器來記錄影響表的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:
CREATE TABLE [dbo].[LogTable] ( ID INT IDENTITY(1,1) PRIMARY KEY, SQLText NVARCHAR(MAX), TableName NVARCHAR(128), UpdateDate DATETIME );
EXEC [dbo].[UpdateProcedure];
使用替代方法XEvents:
或者,您可以使用 SQL Server 擴充事件來擷取修改特定資料表的 SQL 語句。與觸發器相比,這提供了更詳細的資訊和靈活性。
設定:
DECLARE @ContextID NVARCHAR(1024);
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]);
EXEC sp_trace_start 1;
EXEC sp_trace_stop 1;
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中文網其他相關文章!