P. 1
Bab Vi Trigger

Bab Vi Trigger

|Views: 68|Likes:
Dipublikasikan oleh SUTEJO

More info:

Published by: SUTEJO on Sep 10, 2012
Hak Cipta:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

11/09/2012

pdf

text

original

BAB VI

TRIGGER
6.1 DEFINISI TRIGGER
• Trigger adalah sebuah objek database yang diasosiasikan dengan sebuah tabel dan
akan aktif (terpicu/trigger ketika sebuah e!ent terjadi pada tabel tersebut
• Trigger hanya terjadi ketika ada eksekusi I"#ERT$ %E&ETE dan '(%ATE pada tabel
yang bersangkutan)
• *aktu eksekusi trigger yang +ungkin terjadi terdiri dari , yaitu BE-.RE dan A-TER
dari state+ent #/&0nya
6.2 KEUNTUNGAN MENGGUNAKAN TRIGGER
• Trigger dapat digunakan untuk +engubah data sebelu+ proses I"#ERT dilakukan atau
untuk +e+berikan nilai default) 1isal +engubah data yang diluar nilai yang
diperbolehkan) 1isalnya$ jika ada pengisian nilai diatas 233$ +aka akan dijadikan 233)
• Anda dapat +enyi+pan data suatu record ke tabel lain (+isalnya history sebelu+ data
tersebut diupdate atau didelete) #ehingga se+ua perubahan data dapat terlacak dari
sejak data itu dibuat)
6. 3 STRUKTUR TRIGGER
CREATE TRINGGER nama_trigger
{ BEFRE ! AFTER "
{ INSERT ! U#DATE ! DE$ETE "
N nama_ta%e&
FR EAC' R(
Statement)*tatement
6.+ MENGAKSES NI$AI BARU DAN $AMA
• %idala+ trigger$ anda dapat +engakses data la+a dan baru) %ata la+a dapat
direference dengan record .&% dan data baru dapat dideference dengan record "E*)
.(ERA#I "E*
(REA%/*RITE
.&%
(REA%
I"#ERT 4
'(%ATE 4 4
%E&ETE 4
• 'ntuk +engacu ke sebuah field dapat ditulis dengan "E*)na+afield atau
.&%)na+afield)
CNT' 1
• Ada sebuah database dbAkde+ik yang +e+punyai tabel +ahasis5a 6ni+$ na+a$
ala+at7)
• Buatlah sebuah trigger yang akan +enyi+pan history ala+at) 8ika sebuah ala+at
berubah$ +aka ala+at la+a harus disi+pan ke tabel history9ala+at9+hs)
,A(AB -
• (ersiapan a5al
mysql> CREATE DATABASE dbAkademik;
mysql> USE dbAkademik;
mysql> CREATE TABLE mhs(
-> Nim VARCHAR(1! "R#$AR% &E%'
-> Nama VARCHAR((! N)* N+ll'
-> Alama* VARCHAR(,! N)* N+ll!;
mysql> #NSERT #NT- mhs .al+es
-> (/01(213,/'/Se4*a5i) Sa6i*a/'/7l1 aa N)11/!'
-> (/01(213(/'/Ta8*) Ta+9ik N/'/7l1 bb N)1,/!'
-> (/01(21:,/'/#59a8 ;a<a5+dy/'/7l1 == N)12/!;
mysql> CREATE TABLE his*)5y>alama*>mhs(
-> ?ak*+ da*e*ime'
-> Nim VARCHAR(@!'
-> Alama* VARCHAR(,!'
-> -leh VARCHAR((!!;
1
• (e+buatan trigger
mysql> DEL#$#TER AA
mysql> DR-" TR#BBER #; EC#STS *5i6>+4da*e>mhs AA
D+e5y -&' 5)Es a99e=*ed' 1 Ea58i86 (1, se=!
mysql> CREATE TR#BBER *5i6>+4da*e>mhs
-> A;TER U"DATE -N mhs
-> ;-R EACH R-?
-> BEB#N
-> #NSERT #NT- his*)5y>alama*>mhs
-> VALUES (8)E(!' -LD18im' -LD1alama*' USER(!!;
-> ENDAA
D+e5y -&' 5)Es a99e=*ed (10 se=!
mysql> DEL#$#TER ;
• :ontoh penggunaan trigger
mysql> U"DATE mhs SET alama*F/Ds1 Lembah 7e*is R* 2,A11 $adi+8/
-> ?HERE 8imF/01(213,/;
mysql> U"DATE mhs SET alama*F/7l1 Se*iyasa 1, $adi+8/
-> ?HERE 8imF/01(213(/;
mysql> U"DATE mhs SET alama*F/7l1 R)866) "+s*)k) R* : RE 2 $adi+8/
-> ?HERE 8imF/01(21:,/;
mysql> sele=* G 95)m mhs;
H------------H-----------------H---------------------------------------H
I Nim I Nama I Alama* I
H------------H-----------------H---------------------------------------H
I 01(213, I Se4*a5i) Sa6i*a I Ds1 Lembah 7e*is R* 2,A11 $adi+8 I
I 01(213( I Ta8*) *a+9ik N I 7l1 Se*iyasa 1, $adi+8 I
I 01(21:, I #59a8 ;a<a5+9y I 7l1 R)866) "+s*)k) R* : RE 2 $adi+8 I
H------------H-----------------H---------------------------------------H
mysql> sele=* G 95)m his*)5y>alama*>mhs;
H---------------------H------------H-------------H----------------H
I ?ak*+ I Nim I Alama* I -leh I
H---------------------H------------H-------------H----------------H
I ,1-1-10 2J31J32 I 01(213, I 7l1 aa N)11 I 5))*Kl)=alh)s* I
I ,1-1-10 2J3,J2, I 01(213( I 7l1 bb N)1, I 5))*Kl)=alh)s* I
I ,1-1-10 2J32J12 I 01(21:, I 7l1 == N)12 I 5))*Kl)=alh)s* I
H---------------------H------------H-------------H----------------H
• 'ntuk +elihat se+ua ala+at yang pernah digunakan +hs yang berni+ ;3<)=>)33?,;
adalah @
mysql> (SELECT 8)E(! Eak*+' alama* ;R-$ mhs ?HERE 8imF/01(213,/!
-> UN#-N
-> (SELECT Eak*+'alama* ;R-$ his*)5y>alama*>mhs ?HERE 8imF/01(213,/!
-> -RDER B% Eak*+ DESC;
H---------------------H----------------------------------H
I Eak*+ I alama* I
H---------------------H----------------------------------H
I ,1-1-10 3JJ( I Ds1 Lembah 7e*is R* 2,A11 $adi+8 I
I ,1-1-10 2J31J32 I 7l1 aa N)11 I
H---------------------H----------------------------------H
• Trigger perta+a +e+punyai kekurangan yaitu ketika ada perubahan di tabel +hs
5alaupun tidak +engubah kolo+ ala+at$ +aka state+ent I"#ERT di tabel history akan
dijalankan) Trigger ini bisa diopti+alkan dengan +e+buat trigger seperti diba5ah ini @
mysql> DEL#$#TER AA
mysql> DR-" TR#BBER #; EC#STS *5i6>+4da*e>mhs AA
mysql> CREATE TR#BBER *5i6>+4da*e>mhs
-> A;TER U"DATE -N mhs
-> ;-R EACH R-?
-> BEB#N
-> IF OLD.alamat <> NEW.alamat THEN
-> #NSERT #NT- his*)5y>alama*>mhs
-> VALUES(8)E(!'-LD18im'-LD1alama*'USER(!!;
-> END IF;
-> END AA
D+e5y -&' 5)Es a99e=*ed (12 se=!
mysql> DEL#$#TER ;
2
CNT' 2
• 1e+buat sebuah trigger yang akan dieksekusi ketika ada perubahan "I1 di tabel +hs
yang akan +elakukan update ke tabel history9ala+at9+hs untuk +enyesuaikan "I10nya
agar relasinya tidak terlepas)
mysql> DEL#$#TER AA
mysql> DR-" TR#BBER #; EC#STS *5i6>+4da*e>8im AA
mysql> CREATE TR#BBER *5i6>+4da*e>8im
-> A;TER U"DATE -N mhs
-> ;-R EACH R-?
-> BEB#N
-> #; -LD18im L> NE?18im THEN
-> U"DATE his*)5y>alama*>mhs SET 8imFNE?18im ?HERE 8imF-LD18im;
-> END #;;
-> ENDAA
ERR-R 1,2( (3,!J This .e5si)8 )9 $ySDL d)es8/* ye* s+44)5* /m+l*i4le
*5i66e5s Ei*h *he same a=*i)8 *ime a8d e.e8* 9)5 )8e *able/
• 8ika trigger tersebut dieksekusi +aka akan terlihat ada peringatan berisi @ AT.i* /er*i0n 01
M2S3$ 40e*n5t 2et *6770rt 5m6&ti7&e trigger* 8it. t.e *ame a9ti0n time an4 e/ent 10r 0ne
ta%&e: yang artinya anda tidak bisa +e+buat trigger pada sebuah tabel pada 5aktu dan e!ent
yang sa+a)
• #olusi yang bisa dilakukan adalah +enggabung isi trigger trig_674ate_m.* dengan isi trigger
yang baru
mysql> DEL#$#TER AA
mysql> DR-" TR#BBER #; EC#STS *5i6>+4da*e>mhs AA
mysql> CREATE TR#BBER *5i6>+4da*e>mhs
-> A;TER U"DATE -N mhs
-> ;-R EACH R-?
-> BEB#N
-> #; -LD1alama* L> NE?1alama* THEN
-> #NSERT #NT- his*)5y>alama*>mhs
-> VALUES(8)E(!'-LD18im'-LD1alama*'USER(!!;
-> END #;;
-> #; -LD18im L> NE?18im THEN
-> U"DATE his*)5y>alama*>mhs SET 8imFNE?18im ?HERE 8imF-LD18im;
-> END #;;
-> ENDAA
D+e5y -&' 5)Es a99e=*ed (1 se=!
mysql> DEL#$#TER ;
• (engunaan trigger trig_674ate_m.* yang baru @
mysql> SELECT G ;R-$ his*)5y>alama*>mhs;
H---------------------H------------H------------------------H----------------H
I ?ak*+ I Nim I Alama* I -leh I
H---------------------H------------H------------------------H----------------H
I ,1-1-10 2J31J32 I 01(213, I 7l1 aa N)11 I 5))*Kl)=alh)s* I
I ,1-1-10 2J3,J2, I 01(213( I 7l1 bb N)1, I 5))*Kl)=alh)s* I
I ,1-1-10 2J32J12 I 01(21:, I 7l1 == N)12 I 5))*Kl)=alh)s* I
I ,1-1-10 2J(J31 I 01(213( I 7l1 Se*iyasa 1, $adi+8 I 5))*Kl)=alh)s* I
H---------------------H------------H------------------------H----------------H
mysql> U"DATE mhs SET 8imF/01(2113(/ ?HERE 8imF/01(213(/;
mysql> SELECT G ;R-$ his*)5y>alama*>mhs;
H---------------------H------------H------------------------H----------------H
I ?ak*+ I Nim I Alama* I -leh I
H---------------------H------------H------------------------H----------------H
I ,1-1-10 2J31J32 I 01(213, I 7l1 aa N)11 I 5))*Kl)=alh)s* I
I ,1-1-10 2J3,J2, I 01(2113( I 7l1 bb N)1, I 5))*Kl)=alh)s* I
I ,1-1-10 2J32J12 I 01(21:, I 7l1 == N)12 I 5))*Kl)=alh)s* I
I ,1-1-10 2J(J31 I 01(2113( I 7l1 Se*iyasa 1, $adi+8 I 5))*Kl)=alh)s* I
H---------------------H------------H------------------------H----------------H
3 5)Es i8 se* (1 se=!
CNT' 3
• 1e+buat sebuah trigger yang akan +enghapus se+ua data pada tabel history9ala+at9+hs
ketika ada penghapusan pada tabel +hs)
mysql> DEL#$#TER AA
mysql> DR-" TR#BBER #; EC#STS *5i6>dele*e>mhs AA
3
mysql> CREATE TR#BBER *5i6>dele*e>mhs
-> A;TER DELETE -N mhs
-> ;-R EACH R-?
-> BEB#N
-> DELETE ;R-$ his*)5y>alama*>mhs ?HERE 8imF-LD18im;
-> ENDAA
D+e5y -&' 5)Es a99e=*ed (1:2 se=!
mysql> DEL#$#TER ;
• (enggunaan trigger trig9delete9+hs
mysql> SELECT G ;R-$ his*)5y>alama*>mhs;
H---------------------H------------H------------------------H----------------H
I ?ak*+ I Nim I Alama* I -leh I
H---------------------H------------H------------------------H----------------H
I ,1-1-10 2J31J32 I 01(213, I 7l1 aa N)11 I 5))*Kl)=alh)s* I
I ,1-1-10 2J3,J2, I 01(2113( I 7l1 bb N)1, I 5))*Kl)=alh)s* I
I ,1-1-10 2J32J12 I 01(21:, I 7l1 == N)12 I 5))*Kl)=alh)s* I
I ,1-1-10 2J(J31 I 01(2113( I 7l1 Se*iyasa 1, $adi+8 I 5))*Kl)=alh)s* I
H---------------------H------------H------------------------H----------------H
mysql> SELECT G ;R-$ mhs;
H------------H-----------------H---------------------------------------H
I Nim I Nama I Alama* I
H------------H-----------------H---------------------------------------H
I 01(213, I Se4*a5i) Sa6i*a I Ds1 Lembah 7e*is R* 2,A11 $adi+8 I
I 01(21:, I #59a8 ;a<a5+9y I 7l1 R)866) "+s*)k) R* : RE 2 $adi+8 I
I 01(2113( I Ta8*) *a+9ik N I 7l1 Se*iyasa 1,a $adi+8 I
H------------H-----------------H---------------------------------------H
mysql> DELETE ;R-$ mhs Ehe5e 8imF/01(2113(/;
D+e5y -&' 1 5)E a99e=*ed (1:@ se=!
mysql> SELECT G ;R-$ mhs;
H------------H-----------------H---------------------------------------H
I Nim I Nama I Alama* I
H------------H-----------------H---------------------------------------H
I 01(213, I Se4*a5i) Sa6i*a I Ds1 Lembah 7e*is R* 2,A11 $adi+8 I
I 01(21:, I #59a8 ;a<a5+9y I 7l1 R)866) "+s*)k) R* : RE 2 $adi+8 I
H------------H-----------------H---------------------------------------H
mysql> SELECT G ;R-$ his*)5y>alama*>mhs;
H---------------------H------------H-------------H----------------H
I ?ak*+ I Nim I Alama* I -leh I
H---------------------H------------H-------------H----------------H
I ,1-1-10 2J31J32 I 01(213, I 7l1 aa N)11 I 5))*Kl)=alh)s* I
I ,1-1-10 2J32J12 I 01(21:, I 7l1 == N)12 I 5))*Kl)=alh)s* I
H---------------------H------------H-------------H----------------H
CNT' +
• 1e+buat sebuah trigger yang +encegah perubahan pada pri+ary key tabel +hs (field
ni+) 8ika ada perubahan$ +aka ni+ tidak boleh berubah) (agak kontradiksi dengan
contoh ,$ tapi ngak +asalah) #ekedar contoh) Bal ini dapat dilakukan yaitu dengan
+engeset nilai ni+ yang baru ("E*)ni+ dengan nilai yang la+a (.&%)ni+
mysql> DEL#$#TER AA
mysql> DR-" TR#BBER #; EC#STS *5i6>+4da*e>8im>mhs AA
mysql> CREATE TR#BBER *5i6>+4da*e>8im>mhs
-> BE;-RE U"DATE -N mhs
-> ;-R EACH R-?
-> BEB#N
-> SET NE?18imF-LD18im;
-> END AA
D+e5y -&' 5)Es a99e=*ed (11 se=!
mysql> DEL#$#TER ;

• (enggunaan trigger trig9update9ni+9+hs
mysql> SELECT G ;R-$ mhs;
H------------H-----------------H---------------------------------------H
I Nim I Nama I Alama* I
H------------H-----------------H---------------------------------------H
I 01(213, I Se4*a5i) Sa6i*a I Ds1 Lembah 7e*is R* 2,A11 $adi+8 I
I 01(21:, I #59a8 ;a<a5+9y I 7l1 R)866) "+s*)k) R* : RE 2 $adi+8 I
H------------H-----------------H---------------------------------------H
mysql> U"DATE mhs SET 8imF/01(2113,/ ?HERE 8imF/01(213,/;
D+e5y -&' 5)Es a99e=*ed (1 se=!
4
mysql> SELECT G ;R-$ mhs;
H------------H-----------------H---------------------------------------H
I Nim I Nama I Alama* I
H------------H-----------------H---------------------------------------H
I 01(213, I Se4*a5i) Sa6i*a I Ds1 Lembah 7e*is R* 2,A11 $adi+8 I
I 01(21:, I #59a8 ;a<a5+9y I 7l1 R)866) "+s*)k) R* : RE 2 $adi+8 I
H------------H-----------------H---------------------------------------H
TUGAS ..;
• Buatlah database dbTransfer yang +e+punyai tabel Rekening dan tabel Transfer)
• Tabel Rekening +e+punyai field @ "o Int (ri+ary Cey$ "a+a Varchar(>3 dan #aldo %ouble)
• Tabel Transfer untuk +enyi+pan data transaksi transfer +e+punyai field @
0 "oTransaksi @ Int Auto9Incre+ent #rimar2 Ke2
0 *aktuTransaksi @ %ateTi+e
0 "oRek(engiri+ @ Int
0 "oRek(eneri+a @ Int
0 BesarTransfer @ %ouble
+e+punyai constraint foreign key sbb@
C-NSTRA#NT ;&>T5a8s9e51 ;-RE#BN &E%(N)Rek"e86i5im! RE;ERENCES 5eke8i86(N)!'
C-NSTRA#NT ;&>T5a8s9e5, ;-RE#BN &E%(N)Rek"e8e5ima! RE;ERENCES 5eke8i86(N)!;
• Buatlah trigger$ jika ada pena+bahan data di tabel transfer (A-TER I"#ERT ." transfer$
+aka akan +engupdate saldo pada rekening yang bersangkutan sesuai dengan BesarTransfer)
1irip dengan stored procedure Transfer)
#etelah dibuat ikuti langkah0langkah berikut @
2 Isi kan data ke tabel rekening sbb@
mysql> #NSERT #NT- 5eke8i86(8)'8ama'sald)! .al+es(1'/#59a8/'1!'
(,'/Ta8*)/',!;
, (ercobaan ke02 trigger$ dengan +engisikan data ke tabel rekening sbb@
mysql> #NSERT #NT- *5a8s9e5(?ak*+T5a8saksi'N)5ek"e86i5im' N)5ek"e8e5ima'Besa5T5a8s9e5!
.al+es(/,1-11-,/'1','1!;
mysql> sele=* G 95)m *5a8s9e5;
H-------------H---------------------H---------------H---------------H---------------H
I N)T5a8saksi I ?ak*+T5a8saksi I N)Rek"e86i5im I N)Rek"e8e5ima I Besa5T5a8s9e5 I
H-------------H---------------------H---------------H---------------H---------------H
I 1 I ,1-11-, JJ I 1 I , I 1 I
H-------------H---------------------H---------------H---------------H---------------H
> Basil dari percobaan ke02 trigger$ +aka rekening no 2 akan berkurang 233)333 +enjadi <33)333
sedangkan rekening no , akan berta+bah 233)333 +enjadi ,)233)333@
mysql> sele=* G 95)m 5eke8i86;
H----H-------H---------H
I N) I Nama I Sald) I
H----H-------H---------H
I 1 I #59a8 I 0 I
I , I Ta8*) I ,1 I
H----H-------H---------H
4) (ercobaan trigger dengan +elakukan transfer untuk rekening no > +aka akan terjadi
peringatan error Foreign Key karena rekening no > tidak ada di tabel rekening @
mysql> #NSERT #NT- *5a8s9e5(?ak*+T5a8saksi'N)5ek"e86i5im'N)5ek"e8e5ima'Besa5T5a8s9e5!
.al+es(/,1-11-,/'1'2'1!;
ERR-R 13(, (,2!J Ca88)* add )5 +4da*e a =hild 5)EJ a 9)5ei68 key =)8s*5ai8* 9ails
(Mdb*5a8s9e5A*5a8s9e5M' C-NSTRA#NT M;&>T5a8s9e5,M ;-RE#BN &E% (MN)Rek"e8e5imaM!
RE;ERENCES M5eke8i86M (MN)M!!
= (ercobaan ke0, trigger$ dengan +engisikan data ke tabel transfer sbb@
mysql> #NSERT #NT- *5a8s9e5(?ak*+T5a8saksi'N)5ek"e86i5im'N)5ek"e8e5ima'Besa5T5a8s9e5!
.al+es(/,1-11-,/'1','1(!;
mysql> sele=* G 95)m *5a8s9e5;
H-------------H---------------------H---------------H---------------H---------------H
I N)T5a8saksi I ?ak*+T5a8saksi I N)Rek"e86i5im I N)Rek"e8e5ima I Besa5T5a8s9e5 I
H-------------H---------------------H---------------H---------------H---------------H
I 1 I ,1-11-, JJ I 1 I , I 1 I
I , I ,1-11-, JJ I 1 I , I 1( I
H-------------H---------------------H---------------H---------------H---------------H
D Basil dari percobaan ke0, trigger$ +aka rekening no 2 akan berkurang 2=3)333 +enjadi E=3)333
sedangkan rekening no , akan berta+bah 2=3)333 +enjadi ,),=3)333@
5
mysql> sele=* G 95)m 5eke8i86;
H----H-------H---------H
I N) I Nama I Sald) I
H----H-------H---------H
I 1 I #59a8 I N( I
I , I Ta8*) I ,,( I
H----H-------H---------H
6

You're Reading a Free Preview

Mengunduh
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->