Menyambung artikel sebelumnya mengenai fungsi trigger dalam database, pada kesempatan ini saya akan menulis artikel bagaimana cara membuat trigger dengan menggunakan database MySQL. Pada prinsipnya blok kode trigger semuanya sama meskipun beda database.
Kita akan membuat dua buah table sebagai contoh, seperti berikut :
- tb_artikel : untuk menyimpan data artikel.
- tb_artikel_log : untuk menyimpan berbagai perubahan yang terjadi pada table tb_artikel.
Tentunya kita telah membuat database sebelumnya, saya menggunakan database db_belajar sama seperti pada tutorial yang lain. Kemudian di database db_belajar buat table tb_artikel dengan sintak :
1 2 3 4 5 6 7 |
CREATE TABLE `tb_artikel` ( `id` int(8) NOT NULL AUTO_INCREMENT, `judul` varchar(100), `artikel` text, `status` tinyint(1), PRIMARY KEY (`id`) ) |
Buat table tb_artikel_log :
1 2 3 4 5 6 7 8 |
CREATE TABLE `tb_artikel_log` ( `log_id` int(8) NOT NULL AUTO_INCREMENT, `id` int(8) NOT NULL, `perubahan` enum('CREATE','UPDATE','DELETE') NOT NULL, `waktu` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`log_id`), CONSTRAINT `FK_artikel_log_id` FOREIGN KEY (`id`) REFERENCES `tb_artikel` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) |
Buat trigger ketika menambahkan data baru :
1 2 3 4 5 6 |
CREATE TRIGGER `after_insert_artikel` AFTER INSERT ON `tb_artikel` FOR EACH ROW BEGIN SET @tipe = 'CREATE'; INSERT INTO tb_artikel_log (id, perubahan) VALUES (NEW.id, @tipe); END |
Trigger ketika update atau delete (dalam tutorial ini bukan delete yang sebenarnya, tetapi merubah status artikel) data :
1 2 3 4 5 6 7 8 9 10 11 |
CREATE TRIGGER `after_update_artikel` AFTER UPDATE ON `tb_artikel` FOR EACH ROW BEGIN IF NEW.status THEN SET @tipe= 'DELETE'; ELSE SET @tipe= 'UPDATE'; END IF; INSERT INTO tb_artikel_log (id, perubahan) VALUES (NEW.id, @tipe); END |
Supaya lebih mudah memasukkan data, sekaligus melihat data yang tersimpan dan log dari perubahan data, akan lebih baik jika membuat satu halaman untuk melihatnya. Pertama buat file untuk koneksi ke database (db.php)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php define('DB_HOST', 'localhost'); define('DB_USER', 'root'); define('DB_PASS', ''); define('DB_NAME', 'db_belajar'); function connect() { $connect = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME); if (mysqli_connect_errno($connect)) { die("Failed to connect:" . mysqli_connect_error()); } mysqli_set_charset($connect, "utf8"); return $connect; } ?> |
Kemudian buat file untuk Create, Read, Update, Delete data (contoh_trigger.php) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
<?php error_reporting(0); include "db.php"; $connect = connect(); if (!empty($_POST)) { if (empty($_GET['act'])) { $query = "INSERT INTO tb_artikel(judul,artikel) VALUES('" . $_POST['judul'] . "','" . $_POST['artikel'] . "')"; mysqli_query($connect, $query); } else { $query = "UPDATE tb_artikel SET judul = '" . $_POST['judul'] . "', artikel = '" . $_POST['artikel'] . "' WHERE id = '" . $_GET['id'] . "'"; mysqli_query($connect, $query); } } else { switch ($_GET['act']) { case "update" : $query = "SELECT * FROM tb_artikel WHERE id = '" . $_GET['id'] . "'"; $result = mysqli_query($connect, $query); $row = mysqli_fetch_assoc($result); break; case "delete" : $query = "UPDATE tb_artikel SET status = '1' WHERE id = '" . $_GET['id'] . "'"; mysqli_query($connect, $query); break; } } ?> <!DOCTYPE html> <head lang="en"> <meta charset="utf-8"> <title>Contoh Trigger MySQL </title> <style> .data th , .data td { border: 1px solid grey; border-collapse: collapse; padding: 5px; } .data tr:nth-child(odd) { background-color: #f2f2f2; } .data tr:nth-child(even) { background-color: #ffffff; } </style> </head> <body> <h2>Masukkan Data</h2> <form action="" method="post" name="inputdata"> <table border="0"> <tr> <td>Judul</td> <td><input type="text" name="judul" value="<?= $row['judul'] ?>" /></td> </tr> <tr> <td>Artikel</td> <td><textarea name="artikel"><?= $row['artikel'] ?></textarea></td> </tr> <tr> <td></td> <td><input type="submit" value="Simpan" name="simpan"></td> </tr> </table> </form> <br /> <h2>Daftar Artikel</h2> <table class="data" cellspacing="0" cellpadding="0"> <tr> <th>Judul</th> <th>Action</th> </tr> <?php $sql = "SELECT * FROM tb_artikel WHERE status is null"; if ($result = mysqli_query($connect, $sql)) { while ($row = mysqli_fetch_assoc($result)) { ?> <tr> <td><?= $row['judul'] ?></td> <td>[<a href="contoh_trigger.php?act=update&id=<?= $row['id'] ?>">update</a>] [<a href="contoh_trigger.php?act=delete&id=<?= $row['id'] ?>">delete</a>]</td> </tr> <?php } } ?> </table> <br /> <h2>Log Artikel</h2> <table class="data" cellspacing="0" cellpadding="0"> <tr> <th>Tanggal</th> <th>Judul</th> <th>Action</th> </tr> <?php $sql = "SELECT t1.*, t2.judul FROM tb_artikel_log AS t1 JOIN tb_artikel AS t2 ON t1.id = t2.id ORDER BY t1.log_id DESC"; if ($result = mysqli_query($connect, $sql)) { while ($row = mysqli_fetch_assoc($result)) { ?> <tr> <td><?= $row['waktu'] ?></td> <td><?= $row['judul'] ?></td> <td><?= $row['perubahan'] ?></td> </tr> <?php } } ?> </table> </body> </html> |
MySQL adalah database paling populer untuk membangun website, untuk panduan lengkapnya bisa cek di Cara Membuat Database di MySQL.
Selamat mencoba, terima kasih 🙂
terimakasi atas info database tentang trigger
Tulisan nya sangat bermanfaat…
My blog
bermanfat tulisan nya sangat…
bang script untuk buat triggernya ndak bisa jalan di phpmyadmin
ada saran?
ada pesan error yang muncul?
ketika menjalankan query :
CREATE TRIGGER
after_insert_artikel
AFTER INSERT ON
tb_artikel
FOR EACH ROWBEGIN
SET @tipe = ‘CREATE’;
INSERT INTO tb_artikel_log (id, perubahan) VALUES (NEW.id, @tipe);
END
muncul pesan error :
#1064 – You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ” at line 4
mohon solusi
apakah primary key di table tb_artikel_log sudah diset auto increment? atau tanda petik di ‘CREATE’ diganti dengan ‘CREATE’
fungsi kolom status itu untuk apa ya?
artikelnya di publish atau engga
Mantap banget artikelnya, sangat bermanfaat..
terima kasih gan 🙂
mas maaf mau nanya gmn ya kalo misalkan saya punya tabel detail, order sama produk nah saya punya tabel order jika statusnya dibatalkan jumlah dari detail itu di kembalikan ke stok produk gmn ya triggernya terima kasih
hi mas, hal itu bisa dilakukan dengan trigger tentunya. Bikin variable dulu untuk mengambil data stok dan kemudian menambahkan stok dengan jumlah order yang batal.
Untuk mendeklarasikan variable, seperti di bawah ini (misal) :
DECLARE stok integer;
Sedangkan untuk memberikan nilai pada variable (misal):
SET @stok := (SELECT stok FROM tb_produk WHERE id = NEW.id);
Lakukan operasi query update untuk table produk seperti biasa. Agak lebih panjang sih dari contoh di atas yg sederhana 🙂
Kalo trigger nya nge insert/update ke tabel di “database” lain bisa ga?
hmmmm belum pernah nyoba sih, tapi kayaknya ga bisa