Profosyonel projelerde oluşturulan veritabanları üzerinde hangi tabloda hangi kullanıcının hangi DML işlemlerini yaptığını bilmek, sistemin kullanışlığı açısından ve güvenlik açısından oldukça önemlidir. Bir işlem yapılırken hata ile karşılaşıldığında o hatanın kim tarafından yapıldığı, ne zaman yaptığı rahatça bulunabilir. Hata sonucu değişen verinin eski değerlerine döndürülmesi gerekebilir. Loglama veritabanımıza bir miktar yük getirse de, hayati bir önem taşıdığı için bu yük göz ardı edilebilir. Veritabanımızdaki table ‘larımıza ait birer tane de Log table olmalıdır. Table’da herhangi değişiklik yada hata olduğu zaman ilgili Log table’da eski halini saklayabilelim. Log table’da orjinal table’ın fieldları yanı sıra isteğe göre LogTarihi, LogUser(table ile kimin çalıştığı), LogType(nasıl bir dml yada ddl işlemi yapıldı),LogHostname gibi ekstra olarak da fieldlar eklenebilir. Hem orjinal hemde Logtable’ımızın şu şekildedir.
Orjinal Table
Log Table
Loglamayı trigger yazarak sağladık. Orjinal table da herhangi bir değişiklik yapıldığında LogTable’a eski verinin yanı sıra , tarihi, kimin tarafından yapılıdığı, nasıl bir işlem olduğu (dml,ddl..),sunucu ismi gibi verileri kaydediyor.Biz bu tablomuzda update ve delete için loglama yaptık.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | ALTER TRIGGER [dbo].[Trud_Ders] ON [dbo].[Ders] AFTER Delete , Update AS BEGIN --update işleminde değişen veri olacağından eğer inserted tablosundan dönen değer -- '0' dan büyük ise update işlemi diyebiliriz. if(( select count (*) from inserted)>0) --update begin print 'update islemi gerceklesti' insert into Ders_Log(Ad, LogTarih, LogUser, LogType, LogHostName) select Ad, GETDATE(),SUSER_SNAME (), 'U' ,HOST_NAME () from deleted end else --delete begin insert into Ders_Log(Ad, LogTarih, LogUser, LogType, LogHostName) select Ad, GETDATE(),SUSER_SNAME (), 'D' ,HOST_NAME () from deleted print 'delete islemi gerceklesti' end END |
İyi çalışmalar…