BEFORE INSERT
// Nama pegawai tidak boleh kosong
DELIMITER //
CREATE TRIGGER before_insert_pegawai_nama
BEFORE INSERT ON tb_pegawai
FOR EACH ROW
BEGIN
IF NEW.nama_pegawai = '' THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Nama pegawai tidak boleh kosong!';
END IF;
END //
DELIMITER ;
Gaji minimal 1.000.000
DELIMITER //
CREATE TRIGGER before_insert_pegawai_gaji
BEFORE INSERT ON tb_pegawai
FOR EACH ROW
BEGIN
IF NEW.gaji < 1000000 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Gaji minimal 1 juta!';
END IF;
END //
DELIMITER ;
Tidak boleh beli jika stok kurang
DELIMITER //
CREATE TRIGGER before_insert_detail_stok
BEFORE INSERT ON tb_detail_transaksi
FOR EACH ROW
BEGIN
DECLARE sisa_stok INT;
SELECT stok INTO sisa_stok
FROM tb_varian_alat_musik
WHERE id = NEW.id_varian_alat_musik;
IF sisa_stok < NEW.qty THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Stok tidak mencukupi!';
END IF;
END //
DELIMITER ;
Nama cabang tidak boleh sama
DELIMITER //
CREATE TRIGGER before_insert_cabang_unik
BEFORE INSERT ON tb_cabang
FOR EACH ROW
BEGIN
DECLARE jumlah INT;
SELECT COUNT(*) INTO jumlah
FROM tb_cabang
WHERE nama_cabang = NEW.nama_cabang;
IF jumlah > 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Nama cabang sudah ada!';
END IF;
END //
DELIMITER ;
AFTER INSERT
AFTER INSERT Membuat Log Otomatis
Setiap ada pegawai baru, sistem mencatat ke tabel log.
buat dulu table baru log :
CREATE TABLE tb_log_pegawai (
id INT AUTO_INCREMENT PRIMARY KEY,
id_pegawai INT,
keterangan VARCHAR(255),
waktu DATETIME
);
buat triger after insert nya :
DELIMITER //
CREATE TRIGGER after_insert_pegawai_log
AFTER INSERT ON tb_pegawai
FOR EACH ROW
BEGIN
INSERT INTO tb_log_pegawai (id_pegawai, keterangan, waktu)
VALUES (NEW.id, 'Pegawai baru ditambahkan', NOW());
END //
DELIMITER ;
AFTER INSERT Mengurangi Stok (Real Case)
Setiap detail transaksi ditambahkan → stok langsung berkurang.
DELIMITER //
CREATE TRIGGER after_insert_detail_kurangi_stok
AFTER INSERT ON tb_detail_transaksi
FOR EACH ROW
BEGIN
UPDATE tb_varian_alat_musik
SET stok = stok - NEW.qty
WHERE id = NEW.id_varian_alat_musik;
END //
DELIMITER ;
BEFORE UPDATE
Nama pegawai tidak boleh diubah menjadi kosong
DELIMITER //
CREATE TRIGGER before_update_pegawai_nama
BEFORE UPDATE ON tb_pegawai
FOR EACH ROW
BEGIN
IF NEW.nama_pegawai = '' THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Nama pegawai tidak boleh kosong!';
END IF;
END //
DELIMITER ;
📌 Konsep yang dipelajari
-
NEW= data yang akan diubah -
BEFORE UPDATE= dijalankan sebelum perubahan terjadi
Gaji tidak boleh diupdate kurang dari 1 juta
DELIMITER //
CREATE TRIGGER before_update_gaji
BEFORE UPDATE ON tb_pegawai
FOR EACH ROW
BEGIN
IF NEW.gaji < 1000000 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Gaji tidak boleh kurang dari 1 juta!';
END IF;
END //
DELIMITER ;
Membandingkan OLD dan NEW
Gaji tidak boleh diturunkan.
DELIMITER //
CREATE TRIGGER before_update_gaji_turun
BEFORE UPDATE ON tb_pegawai
FOR EACH ROW
BEGIN
IF NEW.gaji < OLD.gaji THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Gaji tidak boleh diturunkan!';
END IF;
END //
DELIMITER ;
📌 Konsep Penting
| Keyword | Artinya |
|---|---|
OLD.gaji | gaji sebelum diubah |
NEW.gaji | gaji setelah diubah |
Tanggal lahir tidak boleh lebih dari hari ini.
DELIMITER //
CREATE TRIGGER before_update_tgllahir
BEFORE UPDATE ON tb_pegawai
FOR EACH ROW
BEGIN
IF NEW.tanggal_lahir > CURDATE() THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Tanggal lahir tidak valid!';
END IF;
END //
DELIMITER ;
Konsep yang dipelajari
Function
CURDATE().Validasi Stok Saat Update Transaksi (Menengah)
Jika
qty diubah, stok harus tetap mencukupi.DELIMITER //
CREATE TRIGGER before_update_qty_transaksi
BEFORE UPDATE ON tb_detail_transaksi
FOR EACH ROW
BEGIN
DECLARE stok_barang INT;
SELECT stok INTO stok_barang
FROM tb_varian_alat_musik
WHERE id = NEW.id_varian_alat_musik;
IF stok_barang < NEW.qty THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Stok tidak mencukupi untuk update!';
END IF;
END //
DELIMITER ;
AFTER UPDATE = dijalankan setelah data berhasil diubah
Jika gaji pegawai diubah, sistem otomatis menambahkan bonus 100.000.
DELIMITER //
CREATE TRIGGER after_update_gaji_bonus
AFTER UPDATE ON tb_pegawai
FOR EACH ROW
BEGIN
UPDATE tb_pegawai
SET gaji = gaji + 100000
WHERE id = NEW.id;
END //
DELIMITER ;
Sekarang mulai masuk otomatisasi sistem.
🎯 Kasus
Jika data pegawai diubah, sistem mencatat ke tabel log.
Buat tabel log :
CREATE TABLE tb_log_update_pegawai (
id INT AUTO_INCREMENT PRIMARY KEY,
id_pegawai INT,
keterangan VARCHAR(255),
waktu DATETIME
);
DELIMITER //
CREATE TRIGGER after_update_pegawai_log
AFTER UPDATE ON tb_pegawai
FOR EACH ROW
BEGIN
INSERT INTO tb_log_update_pegawai(id_pegawai, keterangan, waktu)
VALUES (NEW.id, 'Data pegawai telah diupdate', NOW());
END //
DELIMITER ;
📌 Konsep yang dipelajari
-
INSERT ke tabel lain
-
fungsi
NOW()
BEFORE DELETE = dijalankan sebelum data dihapus
"BEFORE DELETE seperti satpam yang memeriksa sebelum barang dibuang."
Misalnya:
-
barang masih ada stok
-
masih dipakai transaksi
-
masih dipakai pegawai
maka tidak boleh dihapus.
Pegawai dengan gaji lebih dari 10 juta tidak boleh dihapus.
DELIMITER //
CREATE TRIGGER before_delete_pegawai
BEFORE DELETE ON tb_pegawai
FOR EACH ROW
BEGIN
IF OLD.gaji > 10000000 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Pegawai dengan gaji tinggi tidak boleh dihapus!';
END IF;
END //
DELIMITER ;
📌 Konsep yang dipelajari
| Keyword | Arti |
|---|---|
OLD | data sebelum dihapus |
Karena saat delete tidak ada NEW, hanya ada OLD.
Pegawai tidak boleh dihapus jika masih memiliki transaksi.
DELIMITER //
CREATE TRIGGER before_delete_pegawai_transaksi
BEFORE DELETE ON tb_pegawai
FOR EACH ROW
BEGIN
DECLARE jumlah INT;
SELECT COUNT(*) INTO jumlah
FROM tb_header_transaksi
WHERE id_pegawai = OLD.id;
IF jumlah > 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Pegawai tidak bisa dihapus karena masih memiliki transaksi!';
END IF;
END //
DELIMITER ;
Cabang tidak boleh dihapus jika masih memiliki pegawai.
DELIMITER //
CREATE TRIGGER before_delete_cabang
BEFORE DELETE ON tb_cabang
FOR EACH ROW
BEGIN
DECLARE jumlah_pegawai INT;
SELECT COUNT(*) INTO jumlah_pegawai
FROM tb_pegawai
WHERE id_cabang = OLD.id;
IF jumlah_pegawai > 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Cabang tidak bisa dihapus karena masih memiliki pegawai!';
END IF;
END //
DELIMITER ;
Varian alat musik tidak boleh dihapus jika stok masih ada.
DELIMITER //
CREATE TRIGGER before_delete_varian
BEFORE DELETE ON tb_varian_alat_musik
FOR EACH ROW
BEGIN
IF OLD.stok > 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Varian tidak bisa dihapus karena stok masih tersedia!';
END IF;
END //
DELIMITER ;
AFTER DELETE = dijalankan setelah data benar-benar dihapus
Biasanya dipakai untuk:
mencatat log
mengembalikan stok
membersihkan atau menyesuaikan data lain
Saat DELETE hanya tersedia OLD, karena data baru tidak ada.
Jika detail transaksi dihapus → stok barang dikembalikan.
DELIMITER //
CREATE TRIGGER after_delete_detail_transaksi
AFTER DELETE ON tb_detail_transaksi
FOR EACH ROW
BEGIN
UPDATE tb_varian_alat_musik
SET stok = stok + OLD.qty
WHERE id = OLD.id_varian_alat_musik;
END //
DELIMITER ;
