Anda di halaman 1dari 14

MATERI PART 4 Prak.

BASISDATA
VIEW dan TRIGGER
LABORATORIUM 4 BASISDATA
MENU PART INI

1. View
a. Algorithm Attributes
b. Updatable View
c. Klausa WITH CHECK OPTION
d. Merubah View
e. Melihat definisi pembuatan view
2. Trigger
a. Membuat trigger
b. BEFORE TRIGGER
c. AFTER TRIGGER
d. Melihat trigger yang sudah dibuat

VIEW
View adalah query tersimpan yang menghasilkan result set ketika dipanggil. View
bertindak sebagai tabel virtual. Beberapa hal yang tidak boleh digunakan pada query
yang mendefinisikan view adalah sebagai berikut:
definisi view tidak boleh memiliki sub query di klausa FROM dari statement SQL
variabel user, sistem, atau lokal tidak boleh digunakan dalam sebuah SQL SELECT
view tidak dapat merujuk ke tabel temporer
trigger tidak dapat diasosiasikan terhadap sebuah view
view yang dibuat di dalam stored procedure tidak dapat merujuk kepada parameter
dalam stored procedure
Pembuatan

view

memerlukan

pendefinisian

nama

view

dan

sebuah

statement

SQL.

Setelah view dibuat, view dapat diquery seperti tabel biasa. Bentuk dasar pembuatan
view adalah sebagai berikut:

CREATE VIEW view_name AS SELECT column_name(s) FROM table_name [WHERE condition]


Pembuatan view dapat menggunakan OR REPLACE untuk mengganti view yang telah ada
sebelumnya.
Berikut adalah contoh pembuatan view sederhana.
mysql> CREATE VIEW view_1 AS SELECT * FROM pegawai;
Query OK, 0 rows affected (0.06 sec)
Setelah view dibuat maka untuk melihat hasilnya kita harus memanggilnya dengan perintah
select, contohnya :
mysql> select*from view_1;
+----------+-----------------------+-------------+----------------+---------+
| nip
| nama_peg
| alamat_peg | jabatan
| gaji
|
+----------+-----------------------+-------------+----------------+---------+
| PEG-1001 | Soeharto Mangundirejo | Yogyakarta | C.E.O
| 9000000 |
| PEG-1002 | Felix Nababan
| Medan
| Manager
| 8000000 |
| PEG-1003 | Olga Syahputra
| Jakarta
| Kepala Unit
| 6000000 |
| PEG-1004 | Chelsea Olivia
| Bandung
| Kepala Unit
| 6000000 |
| PEG-1005 | Tuti Wardani
| Jawa Tengah | Supervisor
| 4500000 |
| PEG-1006 | Budi Drajat
| Malang
| Supervisor
| 4500000 |
| PEG-1007 | Bambang Pamungkas
| Kudus
| Staff Senior
| 3000000 |
| PEG-1008 | Ely Oktafiani
| Yogyakarta | Staff Senior
| 3000000 |
| PEG-1009 | Rani Wijaya
| Magelang
| Staff Senior
| 3000000 |
| PEG-1010 | Rano Karno
| Solo
| Staff Junior
| 2000000 |
| PEG-1011 | Rahmadi Sholeh
| Yogyakarta | Staff Junior
| 2000000 |
| PEG-1012 | Ilham Ungara
| Jakarta
| Staff Junior
| 2000000 |
| PEG-1013 | Endang Melati
| Madiun
| Staff Junior
| 2000000 |
| PEG-1014 | Donny Damara
| Makasar
| Tenaga Kontrak | 1000000 |
| PEG-1015 | Paijem
| Yogyakarta | Tenaga Kontrak | 500000 |
+----------+-----------------------+-------------+----------------+---------+
15 rows in set (0.00 sec)

Dalam peamanggilannya pun kita juga bisa menentukan kondisi yang kita inginkan,
contohnya :
mysql> select*from view_1 limit 3;
+----------+-----------------------+------------+-------------+---------+
| nip
| nama_peg
| alamat_peg | jabatan
| gaji
|
+----------+-----------------------+------------+-------------+---------+
| PEG-1001 | Soeharto Mangundirejo | Yogyakarta | C.E.O
| 9000000 |
| PEG-1002 | Felix Nababan
| Medan
| Manager
| 8000000 |
| PEG-1003 | Olga Syahputra
| Jakarta
| Kepala Unit | 6000000 |
+----------+-----------------------+------------+-------------+---------+
3 rows in set (0.00 sec)
mysql> select*from view_1 where nama_peg = 'Olga Syahputra';
+----------+----------------+------------+-------------+---------+
| nip
| nama_peg
| alamat_peg | jabatan
| gaji
|
+----------+----------------+------------+-------------+---------+
| PEG-1003 | Olga Syahputra | Jakarta
| Kepala Unit | 6000000 |
+----------+----------------+------------+-------------+---------+
1 row in set (0.00 sec)
Penggunaan WHERE dalam syntax VIEW
mysql>
CREATE VIEW view_2
AS SELECT nip, nama_peg, gaji
FROM pegawai
WHERE alamat_peg='Yogyakarta';
Query OK, 0 rows affected (0.02 sec)
mysql> select * from view_2;
+----------+-----------------------+---------+
| nip
| nama_peg
| gaji
|
+----------+-----------------------+---------+
| PEG-1001 | Soeharto Mangundirejo | 9000000 |
| PEG-1008 | Ely Oktafiani
| 3000000 |
| PEG-1011 | Rahmadi Sholeh
| 2000000 |
| PEG-1015 | Paijem
| 500000 |
+----------+-----------------------+---------+
4 rows in set (0.00 sec)

1. Algorithm Attributes
Algorithm attributes memberikan kendali bagaimana MySQL memproses view. Atribut
ini bersifat opsional. Atribut algoritma menerima tiga buah nilai, yaitu MERGE,
TEMPTABLE, dan UNDEFINED.
Default algoritma yang dipilih adalah UNDEFINED.
Untuk algoritma MERGE, teks dari statement query yang merujuk ke sebuah view dan
definisi view digabung sedemikian sehingga bagian dari definisi view menggantikan
bagian yang bersesuaian dengan statement.

Untuk algoritma TEMPTABLE, hasil dari view diambil ke dalam temporary table, yang
kemudian digunakan untuk menjalankan statement. TEMPTABLE dipilih karena lock
pada table yang digunakan dapat langsung dilepas setelah temporary table telah
dibuat. Akibatnya, penggunaan TEMPTABLE dapat mempercepat pelepasan lock pada
table

utama,

sehingga

klien

lain

yang

akan

menggunakan

view

tidak

menunggu

terlalu lama.
Untuk

algoritma

UNDEFINED,

MySQL

memilih

sendiri

algoritma

mana

yang

akan

digunakan. MySQL lebih memilih MERGE karena biasanya lebih efisien. Selain itu,
view yang menggunakan TEMPTABLE tidak dapat diupdate karena menggunakan temporary
table.
Berikut adalah contoh pembuatan view menggunakan atribut algoritma MERGE.
mysql>

CREATE

nama_pegawai,gaji)

ALGORITHM
AS

SELECT

MERGE

nip,

VIEW

nama_peg,

v_merge
gaji

FROM

(nomor_induk_pegawai,
pegawai

WHERE

gaji

>

2000000;
Query OK, 0 rows affected (0.03 sec)
mysql> select*from v_merge;
+---------------------+-----------------------+---------+
| nomor_induk_pegawai | nama_pegawai
| gaji
|
+---------------------+-----------------------+---------+
| PEG-1001
| Soeharto Mangundirejo | 9000000 |
| PEG-1002
| Felix Nababan
| 8000000 |
| PEG-1003
| Olga Syahputra
| 6000000 |
| PEG-1004
| Chelsea Olivia
| 6000000 |
| PEG-1005
| Tuti Wardani
| 4500000 |
| PEG-1006
| Budi Drajat
| 4500000 |
| PEG-1007
| Bambang Pamungkas
| 3000000 |
| PEG-1008
| Ely Oktafiani
| 3000000 |
| PEG-1009
| Rani Wijaya
| 3000000 |
+---------------------+-----------------------+---------+
9 rows in set (0.00 sec)
Adanya tambahan syntax ALGORITHM=MERGE tersebut bertujuan untuk mendeklarasikan
Algoritma mana yang kita pilih, jika kita tidak mendeklarasikannya punjuga bisa
karena MySQL bisa memilih sendiri contoh :
mysql> CREATE VIEW v_merge2(nomor_induk_pegawai, nama_pegawai, gaji) AS SELECT n
ip, nama_peg, gaji FROM pegawai WHERE gaji > 2000000;
Query OK, 0 rows affected (0.03 sec)
mysql> select*from v_merge2;
+---------------------+-----------------------+---------+
| nomor_induk_pegawai | nama_pegawai
| gaji
|
+---------------------+-----------------------+---------+
| PEG-1001
| Soeharto Mangundirejo | 9000000 |
| PEG-1002
| Felix Nababan
| 8000000 |
| PEG-1003
| Olga Syahputra
| 6000000 |
| PEG-1004
| Chelsea Olivia
| 6000000 |
| PEG-1005
| Tuti Wardani
| 4500000 |
| PEG-1006
| Budi Drajat
| 4500000 |

| PEG-1007
| Bambang Pamungkas
| 3000000 |
| PEG-1008
| Ely Oktafiani
| 3000000 |
| PEG-1009
| Rani Wijaya
| 3000000 |
+---------------------+-----------------------+---------+
9 rows in set (0.00 sec)
Algoritma

MERGE

tidak

dapat

digunakan

ketika

view

memerlukan

penggunaan

konstruksi sebagai berikut:


Fungsi aggregate, seperti SUM(), MIN(), MAX(), COUNT() dan lain-lain
DISTINCT
GROUP BY
HAVING
LIMIT
UNION atau UNION ALL
Subquery pada SELECT
Referensi ke nilai literal (tidak ada tabel yang direferensi)
Ketika algoritma MERGE tidak dapat digunakan, kita bisa menggunakan algoritma
TEMPTABLE.
mysql> CREATE ALGORITHM = MERGE VIEW view_4(nomor_induk_pegawai, nama_pegawai,
gaji) AS SELECT nip, nama_peg, gaji FROM pegawai WHERE gaji > 2000000 LIMIT 5;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> show warnings;
+---------+------+-------------------------------------------------------------------------------+
| Level
| Code | Message
|
+---------+------+-------------------------------------------------------------------------------+
| Warning | 1354 | View merge algorithm can't be used here for now (assumed undefined algorithm) |
+---------+------+-------------------------------------------------------------------------------+

1 row in set (0.00 sec)


mysql>

CREATE

ALGORITHM

TEMPTABLE

VIEW

v_temptable(nomor_induk_pegawai,

nama_pegawai, gaji) AS SELECT nip, nama_peg, gaji FROM pegawai WHERE gaji >
2000000 LIMIT 5;
Query OK, 0 rows affected (0.03 sec)
mysql> select * from v_temptable;
+---------------------+-----------------------+---------+
| nomor_induk_pegawai | nama_pegawai
| gaji
|
+---------------------+-----------------------+---------+
| PEG-1001
| Soeharto Mangundirejo | 9000000 |
| PEG-1002
| Felix Nababan
| 8000000 |
| PEG-1003
| Olga Syahputra
| 6000000 |
| PEG-1004
| Chelsea Olivia
| 6000000 |
| PEG-1005
| Tuti Wardani
| 4500000 |
+---------------------+-----------------------+---------+
5 rows in set (0.00 sec)
Ketika

kita

mendefinisikan

pesan warning.

2. Updateable VIEW

VIEW

menggunakan

algoritma

TEMPTABLE

tidak

muncul

Ada beberapa view yang dapat diupdate menggunakan statement UPDATE, DELETE, atau
INSERT.
Update juga dilakukan pada tabel yang dirujuk view tersebut. Supaya sebuah view
dapat diupdate, harus ada hubungan satu-satu antara baris dalam view dengan baris
pada tabelnya. Selain view yang dapat diupdate ada juga view yang tidak dapat
diupdate, yaitu view yang memiliki:
fungsi aggregat, seperti SUM(), MIN(), MAX(), COUNT().
DISTINCT
GROUP BY
HAVING
sub query di SELECT
Join-join tertentu
Nonupdatable view di klausa FROM
Sebuah subquery di klausa WHERE yang merujuk ke sebuah tabel dalam klausa
FROM.
Hanya merujuk ke nilai literal (tidak merujuk ke sebuah tabel)
Menggunakan ALGORITHM = TEMPTABLE (penggunaan temporary table membuat
view

tidak dapat diupdate)

Referensi berulangkali ke kolom manapun dari sebuah tabel.


mysql> UPDATE v_merge2 SET nama_pegawai = 'Olga Syahrini' WHERE nama_pegawai =
'Olga Syahputra';
Query OK, 1 row affected (0.05 sec)
Rows matched: 1

Changed: 1

Warnings: 0

Lalu kita lihat perubahannya pada hasil eksekusi v_merge2;


mysql> select * from v_merge2;
+---------------------+-----------------------+---------+
| nomor_induk_pegawai | nama_pegawai
| gaji
|
+---------------------+-----------------------+---------+
| PEG-1001
| Soeharto Mangundirejo | 9000000 |
| PEG-1002
| Felix Nababan
| 8000000 |
| PEG-1003
| Olga Syahrini
| 6000000 |
| PEG-1004
| Chelsea Olivia
| 6000000 |
| PEG-1005
| Tuti Wardani
| 4500000 |
| PEG-1006
| Budi Drajat
| 4500000 |
| PEG-1007
| Bambang Pamungkas
| 3000000 |
| PEG-1008
| Ely Oktafiani
| 3000000 |
| PEG-1009
| Rani Wijaya
| 3000000 |
+---------------------+-----------------------+---------+
9 rows in set (0.00 sec)
Update pada view v_merge2 juga berefek pada tabel sebenarnya, sehingga update
pada

view

bukan

hanya

merubah

keseluruhan.
Kita bisa lihat sbb :
mysql> select * from pegawai;

data

dlm

view

tetapi

merubah

data

secara

+----------+-----------------------+-------------+----------------+---------+
| nip
| nama_peg
| alamat_peg | jabatan
| gaji
|
+----------+-----------------------+-------------+----------------+---------+
| PEG-1001 | Soeharto Mangundirejo | Yogyakarta | C.E.O
| 9000000 |
| PEG-1002 | Felix Nababan
| Medan
| Manager
| 8000000 |
| PEG-1003 | Olga Syahrini
| Jakarta
| Kepala Unit
| 6000000 |
| PEG-1004 | Chelsea Olivia
| Bandung
| Kepala Unit
| 6000000 |
| PEG-1005 | Tuti Wardani
| Jawa Tengah | Supervisor
| 4500000 |
| PEG-1006 | Budi Drajat
| Malang
| Supervisor
| 4500000 |
| PEG-1007 | Bambang Pamungkas
| Kudus
| Staff Senior
| 3000000 |
| PEG-1008 | Ely Oktafiani
| Yogyakarta | Staff Senior
| 3000000 |
| PEG-1009 | Rani Wijaya
| Magelang
| Staff Senior
| 3000000 |
| PEG-1010 | Rano Karno
| Solo
| Staff Junior
| 2000000 |
| PEG-1011 | Rahmadi Sholeh
| Yogyakarta | Staff Junior
| 2000000 |
| PEG-1012 | Ilham Ungara
| Jakarta
| Staff Junior
| 2000000 |
| PEG-1013 | Endang Melati
| Madiun
| Staff Junior
| 2000000 |
| PEG-1014 | Donny Damara
| Makasar
| Tenaga Kontrak | 1000000 |
| PEG-1015 | Paijem
| Yogyakarta | Tenaga Kontrak | 500000 |
+----------+-----------------------+-------------+----------------+---------+
15 rows in set (0.00 sec)
Sekarang kita coba mengupdate view yang memuat larangan tadi, contoh kita akan
mengupdate v_temptable yang merupakan temptable view, maka syntaxnya :
mysql> UPDATE v_temptable SET nama_pegawai = 'Chelsea' WHERE nama_pegawai=
'Chelsea Olivia';
ERROR 1288 (HY000): The target table v_temptable of the UPDATE is not updatable

3. Klausa WITH CHECK OPTION


Klausa WITH CHECK OPTION dalam pembuatan view diberikan kepada updatable view
untuk mencegah INSERT atau UPDATE pada baris data kecuali klausa WHERE pada
statement SELECT bernilai benar (true). Parameter yang dapat digunakan untuk
CHECK OPTION adalah LOCAL dan CASCADED. Parameter LOCAL berarti pengecekan hanya
dilakukan pada view yang didefinisikan. Parameter CASCADED berarti pengecekan
dilakukan pada view beserta tabel yang direferensi oleh view tersebut. Secara
default, pendefinisian CHECK OPTION bernilai CASCADED.
Berikut adalah contoh definisi view menggunakan CHECK OPTION:
mysql> CREATE VIEW v_1 AS SELECT nip, nama_peg, gaji FROM pegawai WHERE gaji
<2000000 WITH CHECK OPTION;
Query OK, 0 rows affected (0.03 sec)
mysql> select * from v_1;
+----------+---------------+---------+
| nip
| nama_peg
| gaji
|
+----------+---------------+---------+
| PEG-1014 | Donny Damara | 1000000 |
| PEG-1015 | Paijem
| 500000 |
+----------+---------------+---------+
3 rows in set (0.00 sec)

mysql> CREATE VIEW v_2 AS SELECT * FROM v_1 WHERE gaji > 500000 WITH LOCAL CHECK
OPTION;
Query OK, 0 rows affected (0.03 sec)
mysql> select * from v_2;
+----------+---------------+---------+
| nip
| nama_peg
| gaji
|
+----------+---------------+---------+
| PEG-1014 | Donny Damara | 1000000 |
+----------+---------------+---------+
2 rows in set (0.00 sec)
mysql> CREATE VIEW v_3 AS SELECT * FROM v_1 WHERE gaji > 500000 WITH CASCADED
CHECK OPTION;
Query OK, 0 rows affected (0.03 sec)
mysql> select * from v_3;
+----------+---------------+---------+
| nip
| nama_peg
| gaji
|
+----------+---------------+---------+
| PEG-1014 | Donny Damara | 1000000 |
+----------+---------------+---------+
2 rows in set (0.00 sec)
Pada

View

v_1

kita

membuat

sebuah

view

untuk

menampilkan

data

pegawai

yang

memiliki gaji kurang dari 2jt, lalu kita membuat view v_2 yang berfungsi untuk
mengambil data dari hasil eksekusi view v_1 tetapi dibatasi data pegawai yang
memiliki gaji lebih dari 500rb dan juga memuat klausa WITH LOCAL CHECK OPTION,
sedangkan

view_v3

fungsinya

sama

dengan

view

v_2

tetapi

bedanya

view

v_3

menggunakan klausa WITH CASCADED CHECK OPTION. Untuk melihat perbedaannya kita
bisa melakukan masukkan data sbb :
mysql> insert into v_2 values('PEG-1018','Robert Gugu',3000000);
Query OK, 1 row affected (0.05 sec)
mysql> insert into v_3 values('PEG-1018','Robert Gugu',3000000);
ERROR 1369 (HY000): CHECK OPTION failed 'lab4.v_3'
Insert data pada view v_2 dinyatakan tak ada masalah karena v_2 hanya melihat
atau mengechek secara LOCAL atau hanya yang data lebih dari 500rb, sedangkan
untuk

v_3

dinyatakan

error

karena

dia

mengecheck

secara

CASCADED

atau

keseluruhan, mulai dari pengecheckan v_1 yang direferensikan oleh v_3, dan karena
v_1 memiliki batasan 2jt maka masukkan 3jt ke v_3 dianggap salah.

4. Merubah VIEW
View yang telah kita buat bisa kita modifikasi dengan ALTER VIEW, contohnya sbb :
mysql> ALTER VIEW view_2(NIP, NAMA_PEGAWAI, GAJI) AS SELECT nip, nama_peg, gaji
FROM pegawai WHERE alamat_peg='Yogyakarta';
Query OK, 0 rows affected (0.02 sec)

mysql> select * from view_2;


+----------+-----------------------+---------+
| NIP
| NAMA_PEGAWAI
| GAJI
|
+----------+-----------------------+---------+
| PEG-1001 | Soeharto Mangundirejo | 9000000 |
| PEG-1008 | Ely Oktafiani
| 3000000 |
| PEG-1011 | Rahmadi Sholeh
| 2000000 |
| PEG-1015 | Paijem
| 500000 |
+----------+-----------------------+---------+
5 rows in set (0.02 sec)

5. Melihat Definisi Pembuatan VIEW


Kita bisa melihat kembali syntax kita dalam membuat view, kita bisa menggunakan
syntax :
SHOW CREATE VIEW<nama_view>

mysql> show create view view_2;


atau jika kita ingin melihat struktur viewnya kita juga bisa gunakan
perintah :
DESC <nama_view>
mysql> desc view_2;
+--------------+-------------+------+-----+---------+-------+
| Field

| Type

| Null | Key | Default | Extra |

+--------------+-------------+------+-----+---------+-------+
| NIP

| varchar(8)

| NULL

| NAMA_PEGAWAI | varchar(50) | YES

| NULL

| GAJI

| NULL

| int(7)

| NO
| YES

+--------------+-------------+------+-----+---------+-------+
3 rows in set (0.02 sec)

TRIGGER
Trigger adalah sebuah objek database yang diasosiasikan dengan sebuah tabel. Trigger
diaktifkan

ketika

sebuah

event

terjadi

pada

tabel

yang

diasosiasikan.

Tabel

yang

diasosiasikan dengan trigger haruslah sebuah tabel yang permanen dan bukan temporary
tabel.

1. Membuat Trigger
Trigger bisa dibuat dengan syntax sbb :

CREATE TRIGGER <trigger_name> <trigger_time> <trigger_event>


ON <table>
FOR EACH ROW <trigger_body statements>
Pada sintaks di atas, trigger_name adalah nama dari trigger yang akan kita buat.
Trigger_time adalah saat aktivasi trigger. Parameter trigger_time dapat berisi
BEFORE atau AFTER, yang menandakan apakah aktivasi trigger dilakukan sebelum atau
sesudah terjadi perubahan pada tabel.
Trigger_event menunjukkan jenis statement yang mengaktifkan trigger.
Trigger_event dapat didefinisikan sebagai salah satu dari:

INSERT: trigger diaktifkan ketika sebuah baris baru ditambahkan ke tabel,


sebagai contoh melalui statement INSERT, LOAD DATA, atau REPLACE.

UPDATE: trigger diaktifkan ketika sebuah baris dimodifikasi, sebagai contoh


melalui statement UPDATE.

DELETE:
DELETE

trigger
dan

diaktifkan

REPLACE.

Namun

ketika

sebuah

demikian,

baris

DROP

TABLE

dihapus,
dan

melalui

TRUNCATE

statement

TABLE

tidak

mengaktifkan trigger DELETE


Tidak boleh ada dua buah trigger yang sama pada sebuah tabel yang memiliki
trigger_time

dan

trigger_event

yang

sama.

Sebagai

contoh,

kita

tidak

dapat

membuat dua buah BEFORE UPDATE trigger pada satu buah tabel yang sama, namun kita
dapat membuat trigger BEFORE UPDATE dan AFTER UPDATE untuk satu tabel yang sama.
trigger_body merupakan definisi statement yang dijalankan ketika sebuah trigger
diaktifkan.

Jika

ada

beberapa

statement

yang

ingin

dijalankan,

statement-

statement tersebut dapat didefinisikan di antara BEGIN AND.


Keyword OLD dan NEW dapat digunakan untuk mereferensi nilai sebelum dan sesudah
trigger dilakukan. Sebagai contoh OLD.nama_kolom menunjukkan nilai kolom sebelum
data tersebut dihapus atau diupdate, sedangkan NEW.nama_kolom menunjukkan nilai
kolom sebuah data yang akan dimasukkan atau nilai kolom data setelah diupdate.

2. BEFORE TRIGGER

Berikut adalah contoh trigger yang dijalankan sebelum data dimasukkan ke dalam
sebuah tabel.
mysql> DELIMITER #
mysql> CREATE TRIGGER sebelum_insert BEFORE INSERT ON pegawai FOR EACH ROW
BEGIN
IF NEW.gaji IS NULL OR NEW.gaji = 0
THEN
SET NEW.gaji = 500000;
ELSE
SET NEW.gaji = NEW.gaji + 100000;
END IF;
END #
Query OK, 0 rows affected (0.23 sec)
Mysql> DELIMITER ;
Dalam

TRIGGER

diatas

adalah

salah

satu

contoh

trigger

yang

akan

dijalankan

sebelum sebuah even dipanggil (BEFORE INSERT). Dalam trigger ini akan mengganti
nilaigaji jika gaji yang di-INSERT-kan bernilai NULL atau 0 dan akan menambahkan
nilai 100rb jika kita masuk
kan selain NULL dan 0.
Berikut contoh masukkan data setelah didefinisikan trigger :
INPUT NILAI NULL atau 0
mysql> insert into pegawai values('PEG-1017','Astuti','Kudus','Staff Junior',0);
Query OK, 1 row affected (0.05 sec)
mysql> select * from pegawai;
+----------+-----------------------+-------------+-----------------+---------+
| nip
| nama_peg
| alamat_peg | jabatan
| gaji
|
+----------+-----------------------+-------------+-----------------+---------+
| PEG-1001 | Soeharto Mangundirejo | Yogyakarta | C.E.O
| 9000000 |
| PEG-1002 | Felix Nababan
| Medan
| Manager
| 8000000 |
| PEG-1003 | Olga Syahrini
| Jakarta
| Kepala Unit
| 6000000 |
| PEG-1004 | Chelsea Olivia
| Bandung
| Kepala Unit
| 6000000 |
| PEG-1005 | Tuti Wardani
| Jawa Tengah | Supervisor
| 4500000 |
| PEG-1006 | Budi Drajat
| Malang
| Supervisor
| 4500000 |
| PEG-1007 | Bambang Pamungkas
| Kudus
| Staff Senior
| 3000000 |
| PEG-1008 | Ely Oktafiani
| Yogyakarta | Staff Senior
| 3000000 |
| PEG-1009 | Rani Wijaya
| Magelang
| Staff Senior
| 3000000 |
| PEG-1010 | Rano Karno
| Solo
| Staff Junior
| 2000000 |
| PEG-1011 | Rahmadi Sholeh
| Yogyakarta | Staff Junior
| 2000000 |
| PEG-1012 | Ilham Ungara
| Jakarta
| Staff Junior
| 2000000 |
| PEG-1013 | Endang Melati
| Madiun
| Staff Junior
| 2000000 |
| PEG-1014 | Donny Damara
| Makasar
| Tenaga Kontrak | 1000000 |
| PEG-1015 | Paijem
| Yogyakarta | Tenaga Kontrak | 500000 |
| PEG-1016 | Djono
| Yogyakarta | Tenanga Kontrak | 1000000 |
| PEG-1017 | Astuti
| Kudus
| Staff Junior
| 500000 |
+----------+-----------------------+-------------+-----------------+---------+
17 rows in set (0.00 sec)
INPUT DENGAN NILAI
mysql>

insert

Junior',1000000);

into

pegawai

values('PEG-1018','Puspito','Magelang','Staff

Query OK, 1 row affected (0.03 sec)


mysql> select * from pegawai;
+----------+-----------------------+-------------+-----------------+---------+
| nip
| nama_peg
| alamat_peg | jabatan
| gaji
|
+----------+-----------------------+-------------+-----------------+---------+
| PEG-1001 | Soeharto Mangundirejo | Yogyakarta | C.E.O
| 9000000 |
| PEG-1002 | Felix Nababan
| Medan
| Manager
| 8000000 |
| PEG-1003 | Olga Syahrini
| Jakarta
| Kepala Unit
| 6000000 |
| PEG-1004 | Chelsea Olivia
| Bandung
| Kepala Unit
| 6000000 |
| PEG-1005 | Tuti Wardani
| Jawa Tengah | Supervisor
| 4500000 |
| PEG-1006 | Budi Drajat
| Malang
| Supervisor
| 4500000 |
| PEG-1007 | Bambang Pamungkas
| Kudus
| Staff Senior
| 3000000 |
| PEG-1008 | Ely Oktafiani
| Yogyakarta | Staff Senior
| 3000000 |
| PEG-1009 | Rani Wijaya
| Magelang
| Staff Senior
| 3000000 |
| PEG-1010 | Rano Karno
| Solo
| Staff Junior
| 2000000 |
| PEG-1011 | Rahmadi Sholeh
| Yogyakarta | Staff Junior
| 2000000 |
| PEG-1012 | Ilham Ungara
| Jakarta
| Staff Junior
| 2000000 |
| PEG-1013 | Endang Melati
| Madiun
| Staff Junior
| 2000000 |
| PEG-1014 | Donny Damara
| Makasar
| Tenaga Kontrak | 1000000 |
| PEG-1015 | Paijem
| Yogyakarta | Tenaga Kontrak | 500000 |
| PEG-1016 | Djono
| Yogyakarta | Tenanga Kontrak | 1000000 |
| PEG-1017 | Astuti
| Kudus
| Staff Junior
| 500000 |
| PEG-1018 | Puspito
| Magelang
| Staff Junior
| 1100000 |
+----------+-----------------------+-------------+-----------------+---------+
18 rows in set (0.00 sec)
Namun demikian, kita tidak dapat mengupdate tabel yang sama dengan tabel yang
diasosiasikan dengan trigger menggunakan trigger.
Mysql> DELIMITER #
mysql> CREATE TRIGGER before_update BEFORE UPDATE ON pegawai FOR EACH ROW
BEGIN
UPDATE

pegawai

SET

gaji=gaji+(NEW.gaji

OLD.gaji)

WHERE

nip=NEW.nip;
END #
Query OK, 0 rows affected (0.03 sec)
mysql> DELIMITER ;
mysql> UPDATE pegawai SET gaji = 2000000 WHERE nip="PEG-1017";
ERROR

1442

(HY000):

Can't

update

table

'pegawai'

in

stored

function/trigger

because it is already used by statement which invoked this stored function


/trigger.

3. AFTER TRIGGER
Berikut

adalah

contoh

trigger

yang

dijalankan

setelah

update

dilakukan

terhadap tabel
Untuk mencobanya kita buat dulu table pencatat, nanti di table pencatat ini akan
kita buat syntax untuk mencatat perubahan yang terjadi.
mysql> create table pencatat(catatan varchar(50));
Query OK, 0 rows affected (0.48 sec)

mysql> delimiter #

kita buat TRIGGERnya untuk mencatat perubahan yang terjadi


mysql> CREATE TRIGGER trigger_cat AFTER UPDATE ON pegawai FOR EACH ROW
BEGIN
INSERT INTO pencatat
VALUES(concat('akun ',NEW.nip,' dari ',OLD.gaji, ' to
',NEW.gaji));
END
#
Query OK, 0 rows affected (0.17 sec)
mysql> delimiter ;
Kita rubah nilai dari gaji yang ada
mysql> UPDATE pegawai SET gaji=gaji+200000;
Query OK, 18 rows affected (0.09 sec)
Rows matched: 18 Changed: 18 Warnings: 0
mysql> select * from pencatat;
+---------------------------------------+
| catatan
|
+---------------------------------------+
| akun PEG-1001 dari 9000000 to 9200000 |
| akun PEG-1002 dari 8000000 to 8200000 |
| akun PEG-1003 dari 6000000 to 6200000 |
| akun PEG-1004 dari 6000000 to 6200000 |
| akun PEG-1005 dari 4500000 to 4700000 |
| akun PEG-1006 dari 4500000 to 4700000 |
| akun PEG-1007 dari 3000000 to 3200000 |
| akun PEG-1008 dari 3000000 to 3200000 |
| akun PEG-1009 dari 3000000 to 3200000 |
| akun PEG-1010 dari 2000000 to 2200000 |
| akun PEG-1011 dari 2000000 to 2200000 |
| akun PEG-1012 dari 2000000 to 2200000 |
| akun PEG-1013 dari 2000000 to 2200000 |
| akun PEG-1014 dari 1000000 to 1200000 |
| akun PEG-1015 dari 500000 to 700000
|
| akun PEG-1016 dari 1000000 to 1200000 |
| akun PEG-1017 dari 500000 to 700000
|
| akun PEG-1018 dari 1100000 to 1300000 |
+---------------------------------------+
18 rows in set (0.00 sec)
TRIGGER diatas akan dieksekusi setelah perintah UPADATE dijalankan.

4. Melihat dan Menghapus Trigger yang Sudah Dibuat

Untuk melihat TRIGGER kita bisa menggunakan syntax

mysql> show triggers in lab4;


mysql> drop trigger <nama_trigger>;
drop trigger before_update;