MsSQL Express 2008 DataBase Trigger
MsSQL Express 2008 DataBase Trigger
Merhabalar,
Ben MsSQL Express 2008 ' de bir program hazırlıyorum. MSSQL Server i ilk defa böyle büyük bir projede kullanıyorum. Daha önceleri FB yada MySQL kullanıyorduk.
Sorum şu : Sİstemimde log diye bir tablo var yapısı şöyle
log
----------
id
tablo
islem
tarih
Amacım tablodan da anlaşılabileceği gibi. Herhangi bir tabloda silme, kaydetme yada güncelleme işlemleri yapıldığında buraya işlemek. Bunu ise bütün veritabanına 1 trigger yazarak yapabilmem mümkünmüdür? Ben kendi çapımda araştırmalar yaptım fakat istediğim sonuca ulaşamadım.
Şimdiden ilginize teşekkür ediyorum.
Cümleten iyi çalışmalar.
Ben MsSQL Express 2008 ' de bir program hazırlıyorum. MSSQL Server i ilk defa böyle büyük bir projede kullanıyorum. Daha önceleri FB yada MySQL kullanıyorduk.
Sorum şu : Sİstemimde log diye bir tablo var yapısı şöyle
log
----------
id
tablo
islem
tarih
Amacım tablodan da anlaşılabileceği gibi. Herhangi bir tabloda silme, kaydetme yada güncelleme işlemleri yapıldığında buraya işlemek. Bunu ise bütün veritabanına 1 trigger yazarak yapabilmem mümkünmüdür? Ben kendi çapımda araştırmalar yaptım fakat istediğim sonuca ulaşamadım.
Şimdiden ilginize teşekkür ediyorum.
Cümleten iyi çalışmalar.
Re: MsSQL Express 2008 DataBase Trigger
Maalesef Trigger veritabanı için değil seçilmiş bir tablo için kurulur. Bunu ağaç yapısında trigger ararken de görebilirsin. İstediğin şeyi ben de uyguladım. Bunun için her tablonun her sütunu için trigger yazman lazım. daha doğrusu, her tablo için bir update (tüm sütunlar için kontrol etmelisin), bir de delete trigger yazman gerekecek. Ama Trigger kullanırken bazı pürüzlerin olabileceğini dikkate alman gerek.
1.Trigger kullanımı performans açısından mümkün mertebe kaçınılması gereken bir nesne
2. Bir de Delete ya da Update trigger yazdıysan o zaman aynı anda bir kaç tane update/delete yapan query hata verecek.(Maximum number of allowed nested triggers\ stored procedures....)
Mesela:
Bu yüzden ben yukarıdaki gibi Queryleri mecburen döngüyle yapıyorum.(Bu da hiç hoşuma gitmiyor.Ama ne yapmalı yönetim böyle istiyor.)
Önerim daha işe başlamadıysan Trigger yerine Stored Procedure kullanman.Çünkü Stored Procedure'lar en ideal nesnelerdir. (Anlıyorum, diyebilirsin ki,peki o zaman Triggerler neden mevcut.Ben de derim ki, maalesef mevcut olan tüm nesneler performans açısından tavsiye olunmuyor.Amma ille de kullanacaksan bir felaket de olmaz
)
Başarılar....
1.Trigger kullanımı performans açısından mümkün mertebe kaçınılması gereken bir nesne
2. Bir de Delete ya da Update trigger yazdıysan o zaman aynı anda bir kaç tane update/delete yapan query hata verecek.(Maximum number of allowed nested triggers\ stored procedures....)
Mesela:
Kod: Tümünü seç
UPDATE CUSTOMERS SET CUSTOMERTYPEID=2 WHERE CUSTOMERTYPEID=4--Bu zaman büyük ihtimal hata verecek
Önerim daha işe başlamadıysan Trigger yerine Stored Procedure kullanman.Çünkü Stored Procedure'lar en ideal nesnelerdir. (Anlıyorum, diyebilirsin ki,peki o zaman Triggerler neden mevcut.Ben de derim ki, maalesef mevcut olan tüm nesneler performans açısından tavsiye olunmuyor.Amma ille de kullanacaksan bir felaket de olmaz

Başarılar....
İstikrar sürsün, Türkiye'm büyüsün inşallah.
Re: MsSQL Express 2008 DataBase Trigger
s.a.
@a.mikayil;
trigger ler ile ilgili aşağıdaki linki takip ederek sorununuza çözüm bulabilirsiniz.
http://delphiturkiye.com/forum/posting. ... 27&t=28021
@seho;
eğer trigger içinden triggerin hangi tablo için çalıştığını bulabilirsen dediğin şeyi yapabilirsin. tablo ismi nasıl bulunur onu bilemiyorum.
kolay gelsin.
@a.mikayil;
trigger ler ile ilgili aşağıdaki linki takip ederek sorununuza çözüm bulabilirsiniz.
http://delphiturkiye.com/forum/posting. ... 27&t=28021
@seho;
eğer trigger içinden triggerin hangi tablo için çalıştığını bulabilirsen dediğin şeyi yapabilirsin. tablo ismi nasıl bulunur onu bilemiyorum.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Re: MsSQL Express 2008 DataBase Trigger
Benzer birşey için bi tane prosedür yazdım ve işlemlerin tuşlarına ekledim sql ile epey bir zaman harcaman gerekebilir. Belki transactionlarda yakalabilirsin bir incelemek lazım onu da.
Re: MsSQL Express 2008 DataBase Trigger
Aslında eğer Trigger kullanacağım diyorsan, Delphi(ve ya her hangi bir compiler'da ) veri tabanındaki her tablonun her sütunu için Trigger oluşturacak küçük bir program yaza bilirsin. Bu sayede sadece 2-3 dakikada tüm tablolarda istediğin Trigger oluşur. Bir defa yazacaksın sonra hep diğer yazılımlarında da kullanacaksın.Yoksa ortalama 15 tane tablo olduğunu ve her tabloda ortalama 5 sütunun olduğunu varsayarsak bu gerçekten de baya vaktini alır. Aslında ben sana o programı gönderirdim de, kul ve şirket hakkı olduğu için maalesef gönderemiyorum. Anlayacağın gibi döngüyle olacak bir ve ya bir kaç Query.
İstikrar sürsün, Türkiye'm büyüsün inşallah.
Re: MsSQL Express 2008 DataBase Trigger
Merhabalar,
İlk olarak cevaplarınıza teşekkür ederim.
@a.mikayil, dediğin gibi o tür sorgularda maalesef triggeri de satır satır işletmen gereliyor. O dediğin olayın çözümü var bir nevi ama yine uğraşmak gerekiyor. Birde ben her tablonun sütunlarını değil sadece hangi tablonun olduğunu ve satır PK sını tutmak istiyorum. Sanırım orada bir yanlış anlaşılma oldu.
Çözüme gelince ben baya bir vakit harcadım ama malesef bir çözüme ulaşamadım. Olmadı query nesnelerime ek bir özellik daha ekleyerek gerçekleştireceğim bu işlemi de. Ama çözümü var diyorsanız seve seve bekliyorum cevabınızı
.
Arkadaşlar ilgilerinize tekrardan teşekkürler.
Saygılar,
Cümleten iyi çalışmalar.
İlk olarak cevaplarınıza teşekkür ederim.
@a.mikayil, dediğin gibi o tür sorgularda maalesef triggeri de satır satır işletmen gereliyor. O dediğin olayın çözümü var bir nevi ama yine uğraşmak gerekiyor. Birde ben her tablonun sütunlarını değil sadece hangi tablonun olduğunu ve satır PK sını tutmak istiyorum. Sanırım orada bir yanlış anlaşılma oldu.
Çözüme gelince ben baya bir vakit harcadım ama malesef bir çözüme ulaşamadım. Olmadı query nesnelerime ek bir özellik daha ekleyerek gerçekleştireceğim bu işlemi de. Ama çözümü var diyorsanız seve seve bekliyorum cevabınızı

Arkadaşlar ilgilerinize tekrardan teşekkürler.
Saygılar,
Cümleten iyi çalışmalar.
Re: MsSQL Express 2008 DataBase Trigger
Ya o zaman bence daha kolay olur. Eğer doğru anladıysam, mesela diyelim 15 tane esas tablon, bir de bu 15 tabloda update, ya da delete yaparken o tabloların ismini ve primary key'ini (ve muhtemelen tarih, zaman, kullanıcı ismi gibi ek bilgileri de) kaydetmek istediğin bir kayıt tablon var.BU durumda toplam 30 tane trigger yazman gerkecek. Mesela bir misal vereyim:
Diyelim esas tablolardan birinin ismi Employees:
EMPLOYEES
EMPLOYEEID INT(primary key)
EMPLOYEENAME VARCHAR(30)
....... ve saire
Kayıt tablonun da ismi KAYIT:
KAYIT
KAYITID INT(PK)
TABLENAME VARCHAR(30)
TABLEPK INT
.....ve saire
Şimdi bir UPdate trigger yazalım
CREATE TRIGGER [dbo].[TR_EMPLOYEES_UPD]
ON [dbo].[EMPLOYEES]
AFTER UPDATE
AS
DECLARE @TABLEPK INT
SELECT @TABLEPK = (select EMPLOYEEID from deleted)--from inserted de yaza bilirsin ama Delete için de trigger yazacağın için bence from deleted kalsın
BEGIN
INSERT INTO KAYIT(TABLENAME,TABLEPK) VALUES('EMPLOYEES',@TABLEPK)
END
işte bu kadar.Hatta istersen bu kodu kopyalayıp kendine uyarlayabilirsin.Her tablo için bir update bir de delete olmak üzere iki trigger yazacaksın. Kırmızıyla işaretlediğim alanları değiştirmen 15-20 dak'kada tüm triggerları oluşturmana yetecek.
Kolay gele.Eğer bir soru olursa cevaplamaya hazırım
Diyelim esas tablolardan birinin ismi Employees:
EMPLOYEES
EMPLOYEEID INT(primary key)
EMPLOYEENAME VARCHAR(30)
....... ve saire
Kayıt tablonun da ismi KAYIT:
KAYIT
KAYITID INT(PK)
TABLENAME VARCHAR(30)
TABLEPK INT
.....ve saire
Şimdi bir UPdate trigger yazalım
CREATE TRIGGER [dbo].[TR_EMPLOYEES_UPD]
ON [dbo].[EMPLOYEES]
AFTER UPDATE
AS
DECLARE @TABLEPK INT
SELECT @TABLEPK = (select EMPLOYEEID from deleted)--from inserted de yaza bilirsin ama Delete için de trigger yazacağın için bence from deleted kalsın
BEGIN
INSERT INTO KAYIT(TABLENAME,TABLEPK) VALUES('EMPLOYEES',@TABLEPK)
END
işte bu kadar.Hatta istersen bu kodu kopyalayıp kendine uyarlayabilirsin.Her tablo için bir update bir de delete olmak üzere iki trigger yazacaksın. Kırmızıyla işaretlediğim alanları değiştirmen 15-20 dak'kada tüm triggerları oluşturmana yetecek.
Kolay gele.Eğer bir soru olursa cevaplamaya hazırım
İstikrar sürsün, Türkiye'm büyüsün inşallah.
Re: MsSQL Express 2008 DataBase Trigger
@a.mikayil o şekilde zaten yapabiliriz ama amacım aynı triggeri sürekli yazmak değil tek trigger ile tüm tabloları etki altına almaktı. Bu arada tablo sayım 100 üzerinde.
Re: MsSQL Express 2008 DataBase Trigger
Belki bilmediğim için haddimi aşmak istemem ama Trigger sadece belli bir tablo üzerinde olan İnsert, Delete,Update olayları zamanı tetiklenebilir nesnelerdir. Mesela atıyorum, CUSTOMERS tablosunda trigger yoksa o tabloda olabilecek her hangi bir değişikliği nasıl yakalayabiliriz? Bence bu dediğin mantıken mümkün değil. Bence tek yol her tablo için trigger yazman. Ama burada benim uzman ağabeylerim dururken bize daha fazla söz demek düşmez.
İstikrar sürsün, Türkiye'm büyüsün inşallah.
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Re: MsSQL Express 2008 DataBase Trigger
Tablo, veritabanı altı bir kavram. Aslında veritabanı bazlı veya en azından tablolar için böyle genel bir tetikleyici olabilmesi kullanıcı hareketlerinin günlüğünü tutma açısından çok faydalı olabilir. Mesela DDL (veri tabanı yapısallığı) üzerinden yazılabilen tetikleyiciler SQL2005'le kullanıma sunulmuştur. Örnek olarak CREATE TABLE kodunun çalıştırılması yakalanabiliyor. Bunun için de tablo bazlı tetikleyiciler işe yaramaz veritabanı düzeyinde tetikleyici tanımlamak gereklidir. Tabi bunun kayıt üzerinde çalışabilen bir özelliği var mıdır yok mudur henüz bilmiyorum ama varsa böyle bir özellik bu bana da lazım olabilecek bir özellik
.

Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .