Read Time:3 Minute, 16 Second
Alıntıdır...
DML Trigger ile Insert-Update-Delete script’ini loglamak
DDL/DML Trigger’lar auditing için çok sık kullanılan tetikleyicilerdir. Örneğin SQL Server’da Yazılım departmanına verdiğiniz username’i o departmandaki 10 kişi kullanıyor ve bir problem oldu bunu kimin yaptığını ispatlayamıyorsunuz. Bunun için DML Trigger yazarak Insert/Update veya Delete ‘i hangi PC’den, hangi IP’de ve hangi Saatte çalıştırıldığını loglayabilirsiniz.
Peki ya SQL cümleciği?
İşte bunu almak istediğinizde DDL ‘de mümkün ama DML trigger’da maalesef mümkün olmuyor. SQL Server 2008 ile gelen Change Data Capture (CDC) özelliğini kullanarak ilerlemek mümkün fakat SQL Server 2005 için konuşacak olursak DBCC INPUTBUFFER ‘ı kullanıp, o anki Session ID si ile calıştırılan komutu alabiliriz. CDC için ayrıca bir makale yazmayı planlıyorum. O yüzden çok fazla değinmeyeceğim. Peki DBCC INPUTBUFFER ‘ı kullanarak nasıl trigger ile birleştirebilirim derseniz, örnek olarak hazırladığım Delete trigger’ını aşağıya ekliyorum.
[ID] INT IDENTITY NOT NULL , |
[ Action ] NVARCHAR(20) NOT NULL , |
[ Date ] DATETIME DEFAULT (GETDATE()) NOT NULL , |
[IP] NVARCHAR(15) NOT NULL , |
[Logon] NVARCHAR(50) NOT NULL , |
[Hostname] NVARCHAR(50) NOT NULL , |
[SQL] NVARCHAR( MAX ) NOT NULL |
CREATE TRIGGER trgAudit ON dbo.Areas |
CREATE TABLE #DBCC (EventType VARCHAR (50), |
INSERT INTO #DBCC EXEC ( 'DBCC INPUTBUFFER(@@SPID) WITH NO_INFOMSGS' ) |
INSERT INTO AuditYGT ([ Action ], [IP], [Logon], [Hostname], [SQL]) |
, ( SELECT client_net_address FROM sys.dm_exec_connections WHERE Session_id = @@SPID) |
, ( SELECT EventInfo FROM #DBCC) |
Her nekadar istediğimizi bu şekilde çözsek de yüksek transaction’li DB’lerde kullanmanızı tavsiye etmem çünkü içeriğindeki Create/Drop/Insert’ler Database IO’nuzu yükseltecektir.
Happy
0
0 %
Sad
0
0 %
Excited
0
0 %
Sleepy
0
0 %
Angry
0
0 %
Surprise
0
0 %