MsSQL Delete Trigger
MsSQL Delete Trigger
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
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
Fahrettin abinin makalesinde bu bahis geciyor.
naile makaleye ek olarak mssql de DELETE triggeri yazmıstı
naile makaleye ek olarak mssql de DELETE triggeri yazmıstı
ÜŞENME,ERTELEME,VAZGEÇME
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.
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...
* http://delphiturkiye.gunduz.info Seminerler...
* http://www.hakmar.com.tr Kalite bir haktır...
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
-
- Kıdemli Üye
- Mesajlar: 395
- Kayıt: 22 Tem 2004 09:15
- Konum: İzmir
- İletişim:
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.
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)
------------------------
"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)
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)
herkese teşekkürler..
-
- Üye
- Mesajlar: 254
- Kayıt: 16 Şub 2004 06:12
- Konum: istanbul
Re: MsSQL Delete Trigger
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
hata kodu
Ü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
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
---------------------------
Re: MsSQL Delete Trigger
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.)
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.)
- 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
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.
Ö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ı.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
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Re: MsSQL Delete Trigger
Foreign Key yapısı ile de otomatik olarak silinmesini sağlayabilirsiniz.