MsSQL Delete 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
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1526
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

MsSQL Delete Trigger

Mesaj gönderen lazio »

merhaba, MsSql de bir kaydı sildiğimde şartlı olarak diğer tablolardan da kayıt silmek istiyorum. Yani Table1 de bir kayıt silindiğinde Table2 de de Table1.ID = Table2.ID olanlar silinsin.
bunu bir türlü yapamadım? acaba MsSql de trigger olayı farklımı?
Aşağıdaki kod hata veriyor..
kolay gelsin


CREATE TRIGGER dt_Table1 ON Table1
FOR DELETE
AS
DELETE FROM Table2 where Table2.ID = Table1.ID
Resim

..::|YeşilMavi|::..
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

Fahrettin abinin makalesinde bu bahis geciyor.
naile makaleye ek olarak mssql de DELETE triggeri yazmıstı
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

evet benim de aklıma aynısı geldi.... Ornek bir koddan hareketle işlem yapılabilir...

Tabi bir de MsSQL 'in statement level trigger desteği olduğunu unutmamak lazım zira toplu bir delete işlemi ile aynı anda bir çok kayıt silinse bile trigger sadece bir defa çalışacağı için silinen butun kayıtlar için bir döngü ile gerekli detay silme işlemleri yapılamı. naile hanımın verdiği örneği bu anlamda da uygundu.
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1526
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

Allah razı olsun, aşağıdaki gibi çözülüyor..

Kod: Tümünü seç

CREATE TRIGGER dt_Table1 ON Table1 FOR DELETE AS 
BEGIN
  DECLARE @xID INT
  DECLARE SILINENLER CURSOR FOR SELECT ID FROM DELETED 
  OPEN SILINENLER 
  FETCH NEXT FROM SILINENLER INTO  @xID
  WHILE @@FETCH_STATUS <> -1 
  BEGIN 
    DELETE FROM TABLE2 WHERE ID=@xID
    FETCH NEXT FROM SILINENLER INTO  @xID
  END 
  CLOSE SILINENLER 
  DEALLOCATE SILINENLER 
END
Resim

..::|YeşilMavi|::..
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

Denem fırsatı bulamadım ama aşağıdaki şekilde daha az kodla yapabiliyor olmanız gerekli. Akılda tutulması gereken, MSSQL server insert triggerlarında INSERTED ve delete triggerlarında DELETED tablolarının kullanılacağıdır.

Kod: Tümünü seç

CREATE TRIGGER dt_Table1 ON Table1 FOR DELETE AS 
BEGIN 
    DELETE FROM TABLE2 WHERE ID IN (SELECT ID FROM DELETED)
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1526
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

Kod: Tümünü seç

CREATE TRIGGER dt_Table1 ON Table1 FOR DELETE AS 
BEGIN 
    DELETE FROM TABLE2 WHERE ID IN (SELECT ID FROM DELETED) 
çalışıyor..
herkese teşekkürler..
Resim

..::|YeşilMavi|::..
denizfatihi
Üye
Mesajlar: 254
Kayıt: 16 Şub 2004 06:12
Konum: istanbul

Re: MsSQL Delete Trigger

Mesaj gönderen denizfatihi »

Merhaba,

Üstteki örneği kullanarak aşağıdaki triggerı kendime uyarladım ama hata alıyorum hata kodu aşağıdadır, sorun nerede olabilir ?

trigger

Kod: Tümünü seç

CREATE TRIGGER [dbo].[STOKISLM_DELETE] 
ON [dbo].[HAREKET] FOR DELETE AS 
BEGIN 
    DELETE S FROM STOKISLM S WHERE S.DEID IN (SELECT ID FROM DELETED)       
    END
hata kodu

Kod: Tümünü seç

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EOleException with message 'Anahtar sütun bilgileri yetersiz veya yanlış. Güncelleştirme çok fazla satırı etkiledi'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------
yaren
Üye
Mesajlar: 3
Kayıt: 03 Tem 2007 03:54

Re: MsSQL Delete Trigger

Mesaj gönderen yaren »

Toplu Silme olayı gerçekleşiyor. ya delphi ile döngüye sokup tek tek sildireceksiniz ya da SQl içinde bir döngüye sokup öyle sildirmeniz gerekiyor.
ama bu yapı transaction ya da kayıt kilitlemeleriniz varsa çok dikkatli olmanızı gerektiriyor..
(cevap geç geldi ama umarım önceden çözmüşsünüzdür.)
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: MsSQL Delete Trigger

Mesaj gönderen sabanakman »

ADO bileşenleri sanırım o işlem ile kaç kayıt üzerinde çalıştığını ve o işlemden sonra kaç kaydın etkilendiğine bakarak arada fark çıkınca uyarı amaçlı bir istisna üretmektedir. Bunu try-except ile kontrol altına almak da durumu çözebilir ama genel çözüm için bu gibi durumlarda işleme giren kayıtları sayan mekanizmayı "set nocount [ON/OFF]" komutuyla ayarlamak gerekmektedir.
sabanakman yazdı:

Kod: Tümünü seç

ALTER TRIGGER [dbo].[tbl] ON [dbo].[tbl_trigger]
For INSERT as
BEGIN
  set nocount on
..
..
..
  set nocount off
END
Önem verilmesi gereken bir diğer mesele ise tablolarınızda mutlaka "Primary Key" olarak tabir edilen anahtar sıralamanız mutlaka olsun ve ADO bileşenlerinde DataSet lerde bu alan mutlaka bulundurulmalı.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Re: MsSQL Delete Trigger

Mesaj gönderen mkysoft »

Foreign Key yapısı ile de otomatik olarak silinmesini sağlayabilirsiniz.
Cevapla