Mencipta Pencetus untuk Log SQL yang Mempengaruhi Jadual
Apabila berhadapan dengan situasi di mana sumber kemas kini jadual tidak diketahui, ia menjadi penting untuk mengenal pasti pelakunya. Untuk mencapai matlamat ini, anda boleh mencipta pencetus pada jadual yang terjejas untuk menangkap SQL yang dilaksanakan yang mencetuskan kemas kini. Artikel ini menunjukkan dua pendekatan kepada masalah ini: menggunakan pencetus SQL yang mudah dan penyelesaian yang lebih komprehensif dengan peristiwa lanjutan SQL Server 2008.
Kaedah Pencetus SQL:
Buat pencetus pada jadual berkenaan yang melaksanakan prosedur tersimpan untuk merekodkan pernyataan SQL yang mencetuskan kemas kini.
CREATE TRIGGER [triggerName] ON [tableName] AFTER UPDATE AS BEGIN EXEC [storedProcedureName] END
Dalam prosedur tersimpan, log penyataan SQL menggunakan sp_WhoIsActive:
CREATE PROCEDURE [storedProcedureName] AS BEGIN DECLARE @sql_statement NVARCHAR(MAX) EXEC sp_WhoIsActive @output_text = @sql_statement OUTPUT END
Kaedah Peristiwa Lanjutan (SQL Server 2008):
Kaedah ini melibatkan mencipta sesi acara lanjutan yang menangkap butiran tentang pernyataan SQL pelaksanaan.
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
Selepas melaksanakan kemas kini, hentikan sesi dan huraikan data yang ditangkap untuk mendapatkan semula pernyataan 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)
Sertai keputusan dengan DMV untuk mendapatkan maklumat tambahan tentang pelaksanaan:
WITH CapturedResults AS ( ... ) , StackData AS ( ... ) SELECT ... FROM StackData AS sd ...
Pendekatan ini menyediakan cara untuk mengenal pasti pernyataan SQL yang menjejaskan jadual, membolehkan anda menyiasat lebih lanjut dan menyelesaikan sebarang isu.
Atas ialah kandungan terperinci Bagaimanakah saya boleh Log Penyata SQL yang Mempengaruhi Jadual Tertentu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!