Trigger mantığı, çeşitleri, örnek
TRIGGER
Trigger; Eğer SQL DML(INSERT,UPDATE veya DELETE) şeklinde tanımlanmışsa Database tarafından otomatik olarak çalıştırılan bir procedür olarak tanımlanabilir. Trigger lar Bir tablodaki değişikliklerle tetiklenirler.
Bir Trigger mantığı:
1. 1. Bir SQL ifadesi çalışmadan önce yada çalıştıktan sonra tetiklenir.
2. 2. Bir tabloda Trigger satır bazında çalışabilir. Böyle bir Trigger row-level trigger olarak adlandırılır.
3. 3. Bir trigger bütün satırlar için çalıştırılabilir.Böyle bir trigger’a da statement-level Trigger denir.
4. 4. Row-Level Trigger; kolonda UPDATE ifadesinin sonucu olarak tetiklendiğinde eski ve yeni kolon’a erişir.
5. 5. Bir Trigger’ın tetiklenmesi Bir trigger şartının devreye girmesiyle olur.
Farklı Event’lar bir trigger’ı tetikler, Fakat bu Event’lar her zaman 3 gruba ayrılır:
1. a) DML trigger’ları
2. b) INSTEAD OF Trigger’ları
3. c)System Event Trigger’ları
DML Trigger’ları; herhangi bir tabloda INSERT/UPDATE/DELETE ifadeleri ile çalışır. Örnek:
CREATE TABLE isci_durum
(
isim VARCHAR2(30),
tanim VARCHAR2(30),
olay_tarih DATE
);
——–Table created.
CREATE TABLE isci_tazminat
(
sirket VARCHAR2 (100),
isim VARCHAR2(100),
tazminat NUMBER,
cikarilma NUMBER
);
——-Table created.
———–
————
CREATE OR REPLACE PROCEDURE isci_denetleme(isim IN VARCHAR2,
tanim IN VARCHAR2,
olay_tarih IN DATE)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO isci_durum
VALUES(
isci_denetleme.isim,
isci_denetleme.tanim,
isci_denetleme.olay_tarih);
COMMIT;
END;
–
—————Procedure created.
————————–
————————–
CREATE OR REPLACE TRIGGER bef_ins_ceo_comp
BEFORE INSERT
ON isci_tazminat
FOR EACH ROW
DECLARE
ok BOOLEAN :=TRUE;
BEGIN
IFok
THEN
isci_denetleme(:new.isim,’BEFORE INSERT’,SYSDATE);
END IF;
END;
–Trigger created.
–
–
–
SELECT isim, tanim, TO_CHAR(olay_tarih,’MM/DD/YYYY HH:MI:SS’)olay_tarih
FROM isci_durum;
–no rows selected
BEGIN
INSERT INTO isci_tazminat
VALUES(‘M’,
’J',
9100000,
2700);
INSERT INTO isci_tazminat
VALUES(‘A’,
’H',
33200000,
3300);
INSERT INTO isci_tazminat
VALUES(‘E’,
’G',
10700000,
20100);
END;
————————————
–PL/SQL procedure successfully completed.
SELECT isim,tanim,TO_CHAR(olay_tarih,’MM/DD/YYYY HH:MI:SS’) olay_tarih
FROM isci_durum;
–isim
——————————————————————————–
–tanim
——————————————————————————–
–olay_tarih
——————-
–J
–BEFORE INSERT
–07/24/2008 08:03:08
–H
–BEFORE INSERT
–07/24/2008 08:03:08
–isim
——————————————————————————–
–tanim
——————————————————————————–
–olay_tarih
——————-
–G
–BEFORE INSERT
–07/24/2008 08:03:08
ISIM
|
TANIM
|
OLAY_TARIH
|
J
|
BEFORE INSERT
|
02/01/2012 08:46:54
|
H
|
BEFORE INSERT
|
02/01/2012 08:46:54
|
G
|
BEFORE INSERT
|
02/01/2012 08:46:54
|
begin-end ifadesini aynı anda çalıştırmamıza rağmen hepsi için trigger ayrı ayrı devreye girdi.
——
——–
DROP TABLE isci_tazminat;
–
–TABLE dropped.
–
——–
DROP TABLE isci_durum;
——–
–TABLE dropped.
——–Teşekkürler———————–