Before / After Trigger konusu

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Salih
Üye
Mesajlar: 250
Kayıt: 11 Mar 2004 05:36

Before / After Trigger konusu

Mesaj gönderen Salih »

Merhaba,

Data definitions Guide, sayfa 184 der ki :

Kod: Tümünü seç

BEFORE :  data def, sayfa 184 :  "New values for a row can only be altered before actions. A trigger that fires after INSERT and tries to assign a value to NEW.column will have no effect. "

AFTER : The actual column values are not altered until after the action, so triggers that reference values from their target tables will not see a newly inserted or updated value unless they fire after UPDATE or INSERT.
Kullandığım triggerların bir kısmını, ERWIN ile hazırlatmıştım, şimdi bakıyorum da insert triggerlarının çoğu AFTER şeklinde hazırlanmış.
örneğin :

Kod: Tümünü seç

CREATE TRIGGER TI_FATURA FOR FATURA
ACTIVE AFTER INSERT POSITION 0
AS
  /* ERwin Builtin Wed Sep 08 16:35:45 2004 */
  /* INSERT trigger on FATURA */
DECLARE VARIABLE numrows INTEGER;
BEGIN

    select count(*) from BAYILER 
      where NEW.BAYIKODU = BAYILER.BAYIKODU into numrows;
    IF (numrows = 0) THEN
    BEGIN
      EXCEPTION BAYILER_CHILD_INSERT_RESTRICT;
    END
/* BAYI_HESABI tablosunda, yazılan faturadaki tutar ve KDV bilgisini bayinin borcuna yaz. */
 EXECUTE PROCEDURE SPI_FATURA NEW.BAYIKODU,  NEW.TUTAR, NEW.FATKDV,  NEW.FATISKONTO;
END


Bu durumda, önce FATURA tablosuna bir kayıt eklenecek, sonra trigger çalışacak, bir de bakacak BAYILER tablosunda kayıtlı olmayan birine fatura kesmeye kalkılıyor, rollback yaparak, FATURA ya yazdığı kayıdı silecek sanırım değil mi ?

O zaman bu triggerın AFTER değil de BEFORE şeklinde olması daha doğru ve daha hızlı olur. Doğru mu düşünüyorum ?
Sevgi, Saygı.....
Cevapla