MsSQL Express 2008 DataBase Trigger

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
seho
Üye
Mesajlar: 51
Kayıt: 01 Nis 2008 12:40

MsSQL Express 2008 DataBase Trigger

Mesaj gönderen seho »

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.
Kullanıcı avatarı
a.mikayil
Üye
Mesajlar: 83
Kayıt: 07 Ağu 2010 01:55

Re: MsSQL Express 2008 DataBase Trigger

Mesaj gönderen a.mikayil »

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:

Kod: Tümünü seç

 UPDATE CUSTOMERS SET CUSTOMERTYPEID=2 WHERE CUSTOMERTYPEID=4--Bu zaman büyük ihtimal hata verecek
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....
İstikrar sürsün, Türkiye'm büyüsün inşallah.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: MsSQL Express 2008 DataBase Trigger

Mesaj gönderen aslangeri »

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.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
orhancc
Üye
Mesajlar: 585
Kayıt: 24 Ağu 2010 02:14
Konum: İstanbul / Kadıköy
İletişim:

Re: MsSQL Express 2008 DataBase Trigger

Mesaj gönderen orhancc »

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.
Kullanıcı avatarı
a.mikayil
Üye
Mesajlar: 83
Kayıt: 07 Ağu 2010 01:55

Re: MsSQL Express 2008 DataBase Trigger

Mesaj gönderen a.mikayil »

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.
seho
Üye
Mesajlar: 51
Kayıt: 01 Nis 2008 12:40

Re: MsSQL Express 2008 DataBase Trigger

Mesaj gönderen seho »

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.
Kullanıcı avatarı
a.mikayil
Üye
Mesajlar: 83
Kayıt: 07 Ağu 2010 01:55

Re: MsSQL Express 2008 DataBase Trigger

Mesaj gönderen a.mikayil »

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
İstikrar sürsün, Türkiye'm büyüsün inşallah.
seho
Üye
Mesajlar: 51
Kayıt: 01 Nis 2008 12:40

Re: MsSQL Express 2008 DataBase Trigger

Mesaj gönderen seho »

@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.
Kullanıcı avatarı
a.mikayil
Üye
Mesajlar: 83
Kayıt: 07 Ağu 2010 01:55

Re: MsSQL Express 2008 DataBase Trigger

Mesaj gönderen a.mikayil »

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.
Kullanıcı avatarı
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

Mesaj gönderen sabanakman »

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 :mrgreen: .
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla