TRIGGER Pada SQL - Basit Al Fath

Minggu, 01 Maret 2026

TRIGGER Pada SQL


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

KeywordArtinya
OLD.gajigaji sebelum diubah
NEW.gajigaji 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

KeywordArti
OLDdata 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 ;








Comments


EmoticonEmoticon