Selasa, 26 Mei 2026

PERTEMUAN 11: Trigger MySQL: AFTER, BEFORE, WHEN, RAISE, dan Audit Log Otomatis


MAKALAH

Trigger MySQL: AFTER, BEFORE, WHEN, RAISE, dan Audit Log Otomatis

Mata Kuliah: Pemrograman SQL II

Dosen Pengampu : M Reza Redo Islami, S.Kom., M.T.I.


Disusun Oleh:

Nama     : Fitri Amelia Ananti

Npm         : 24781011

Kelas    : MI 4A

 

Tanggal Pembuatan : 26 Mei 2026 

 

PROGRAM STUDI MANAJEMEN INFORMATIKA
JURUSAN TEKNOLOGI INFORMASI
POLITEKNIK NEGERI LAMPUNG
2026

BAB I: PENDAHULUAN

1.1 Latar Belakang

Dalam pengelolaan basis data modern, menjaga integritas dan konsistensi data merupakan tantangan utama yang harus dihadapi oleh setiap pengembang sistem informasi. Seiring dengan meningkatnya kompleksitas aplikasi dan volume transaksi data, diperlukan mekanisme otomatis yang mampu merespons setiap perubahan data secara real-time tanpa campur tangan pengguna secara langsung.

 

Trigger merupakan salah satu fitur paling powerful dalam Sistem Manajemen Basis Data (DBMS) yang memungkinkan eksekusi blok kode SQL secara otomatis sebagai respons terhadap operasi Data Manipulation Language (DML) seperti INSERT, UPDATE, dan DELETE. Dengan memanfaatkan trigger, pengembang dapat mengimplementasikan audit trail otomatis, validasi data tingkat lanjut, serta perlindungan data sensitif tanpa harus memodifikasi logika aplikasi di sisi klien.

 

Praktikum Pemrograman SQL II Minggu ke-11 ini berfokus pada implementasi berbagai jenis trigger dalam SQL Server, meliputi trigger AFTER untuk keperluan audit log otomatis, trigger BEFORE dengan mekanisme RAISE untuk validasi dan proteksi data, trigger kondisional menggunakan klausa WHEN, serta trigger multi-statement yang mampu menjalankan beberapa aksi sekaligus dalam satu pemicu.

 

1.2 Rumusan Masalah

 Bagaimana cara membuat trigger AFTER INSERT, UPDATE, dan DELETE untuk mencatat perubahan data ke tabel audit_log?

 Bagaimana mengakses nilai baris yang baru maupun yang lama menggunakan kata kunci NEW dan OLD?

  Bagaimana menggunakan klausa WHEN untuk membuat trigger yang bersifat kondisional?

  Bagaimana mengimplementasikan trigger BEFORE dengan mekanisme RAISE untuk memblokir operasi DML yang melanggar aturan bisnis?

  Bagaimana menulis body trigger multi-statement yang mengeksekusi lebih dari satu pernyataan SQL dalam satu blok trigger?

 

1.3 Tujuan

      Memahami konsep dan cara kerja trigger dalam SQL Server secara mendalam.

      Mampu mengimplementasikan sistem audit log otomatis menggunakan trigger AFTER.

      Mampu membuat validasi data sisi database menggunakan trigger BEFORE dan RAISE.

      Mampu menerapkan trigger kondisional untuk menghemat kapasitas penyimpanan log.

      Mampu membangun trigger kompleks yang melakukan beberapa aksi sekaligus.

 

1.4 Manfaat

Makalah ini diharapkan memberikan manfaat bagi mahasiswa dalam memahami penggunaan trigger secara praktis dalam lingkungan SQL Server. Secara akademis, makalah ini berkontribusi sebagai referensi bagi mata kuliah Pemrograman SQL II. Secara praktis, pemahaman trigger yang baik akan meningkatkan kemampuan mahasiswa dalam membangun sistem basis data yang andal, aman, dan dapat diaudit.



BAB II: TINJAUAN PUSTAKA

2.1 Pengertian Trigger
Trigger adalah sebuah objek basis data yang berupa blok kode SQL yang dijalankan secara otomatis (fired) oleh DBMS setiap kali terjadi peristiwa DML tertentu pada sebuah tabel. Berbeda dengan stored procedure yang harus dipanggil secara eksplisit, trigger aktif secara implisit sebagai respons terhadap aksi yang didefinisikan.
 
Menurut definisi umum dalam literatur basis data, trigger merupakan mekanisme event-driven yang terikat pada tabel tertentu dan dieksekusi dalam konteks transaksi yang sama dengan pernyataan DML yang memicunya. Hal ini menjadikan trigger sebagai komponen yang sangat terintegrasi dalam manajemen transaksi database.
 
2.2 Jenis-Jenis Trigger
2.2.1 Trigger AFTER
Trigger AFTER dieksekusi setelah operasi DML berhasil dilakukan. Jenis trigger ini paling umum digunakan untuk keperluan audit karena perubahan data sudah terjadi dan dapat dicatat dengan nilai yang akurat. Trigger AFTER tidak dapat membatalkan operasi yang sudah terjadi, namun dapat melakukan aksi tambahan sebagai respons terhadap perubahan tersebut.
 
2.2.2 Trigger BEFORE (INSTEAD OF)
Trigger BEFORE dieksekusi sebelum operasi DML dilakukan. Di lingkungan SQL Server, ini diimplementasikan sebagai INSTEAD OF trigger. Jenis trigger ini sangat efektif untuk validasi data dan proteksi, karena memungkinkan pemblokiran atau modifikasi operasi DML sebelum perubahan benar-benar diterapkan ke tabel.
 
2.2.3 Trigger Kondisional (WHEN)
Trigger kondisional menggunakan klausa WHEN atau pernyataan IF di dalam body trigger untuk membatasi eksekusi hanya pada kondisi data tertentu. Pendekatan ini meningkatkan efisiensi karena mengurangi jumlah entri log yang tidak relevan dan menghemat ruang penyimpanan.
 
2.3 Tabel Virtual inserted dan deleted
SQL Server menyediakan dua tabel virtual yang otomatis tersedia di dalam konteks trigger:
 

 
2.4 Audit Log Database
Audit log adalah rekam jejak digital yang mencatat setiap perubahan yang terjadi pada data dalam sistem basis data. Audit log merupakan komponen krusial dalam sistem keamanan informasi, kepatuhan regulasi (compliance), serta pemulihan data (disaster recovery). Tabel audit_log dalam praktikum ini mencatat informasi: jenis aksi (INSERT/UPDATE/DELETE), tabel yang terpengaruh, kunci referensi baris, kolom yang berubah, nilai sebelum perubahan, nilai sesudah perubahan, serta stempel waktu otomatis.
 
2.5 Perbedaan SQLite vs MySQL/SQL Server




 BAB III: PEMBAHASAN DAN IMPLEMENTASI

3.1 Struktur Database Akademik

Basis data yang digunakan dalam praktikum ini adalah database akademik yang terdiri dari beberapa tabel yang saling terhubung:


 

3.2 Implementasi Trigger Audit (Level 1-3)

3.2.1 Trigger AFTER INSERT (Level 1)

Trigger AFTER INSERT dirancang untuk mencatat setiap penambahan data baru ke dalam tabel audit_log. Berikut adalah contoh implementasi untuk tabel mahasiswa:

 

CREATE TRIGGER trg_after_ins_mahasiswa

ON mahasiswa

AFTER INSERT

AS

BEGIN

  SET NOCOUNT ON;

  INSERT INTO audit_log(aksi, tabel_target, ref_key, nilai_baru)

  SELECT 'INSERT', 'mahasiswa', npm,

         CONCAT('npm=', npm, ', nama=', nama, ', ipk=', CAST(ipk AS VARCHAR))

  FROM inserted;

END;

 

Pada trigger ini, kata kunci SET NOCOUNT ON digunakan untuk menghindari output pesan sistem yang berlebihan. Data dari tabel virtual inserted diambil untuk mendapatkan nilai baris yang baru saja dimasukkan.

 

3.2.2 Trigger AFTER UPDATE (Level 2)

Trigger AFTER UPDATE lebih kompleks karena harus menangkap baik nilai lama (OLD) maupun nilai baru (NEW) dari baris yang dimodifikasi. SQL Server menggunakan join antara tabel deleted (nilai lama) dan inserted (nilai baru):

 

CREATE TRIGGER trg_after_upd_mahasiswa

ON mahasiswa

AFTER UPDATE

AS

BEGIN

  SET NOCOUNT ON;

  INSERT INTO audit_log(aksi, tabel_target, ref_key, kolom, nilai_lama, nilai_baru)

  SELECT 'UPDATE', 'mahasiswa', i.npm,

         'ipk', CAST(d.ipk AS VARCHAR), CAST(i.ipk AS VARCHAR)

  FROM inserted i

  JOIN deleted d ON i.npm = d.npm

  WHERE d.ipk <> i.ipk;

END;

 

3.2.3 Trigger AFTER DELETE (Level 3)

Pada operasi DELETE, data asli telah dihapus dari tabel utama. Oleh karena itu, seluruh informasi yang ingin dicatat harus diambil dari tabel virtual deleted sebelum hilang selamanya:

 

CREATE TRIGGER trg_after_del_mahasiswa

ON mahasiswa

AFTER DELETE

AS

BEGIN

  SET NOCOUNT ON;

  INSERT INTO audit_log(aksi, tabel_target, ref_key, nilai_lama)

  SELECT 'DELETE', 'mahasiswa', npm,

         CONCAT('npm=', npm, ', nama=', nama, ', ipk=', CAST(ipk AS VARCHAR))

  FROM deleted;

END;

 

3.3 Trigger Kondisional WHEN (Level 4)

Trigger kondisional menggunakan pernyataan IF atau WHERE untuk memfilter kondisi tertentu. Contoh berikut hanya mencatat perubahan IPK jika nilainya naik (tidak turun):

 

CREATE TRIGGER trg_when_upd_ipk

ON mahasiswa

AFTER UPDATE

AS

BEGIN

  SET NOCOUNT ON;

  INSERT INTO audit_log(aksi, tabel_target, ref_key, kolom, nilai_lama, nilai_baru)

  SELECT 'UPDATE', 'mahasiswa', i.npm, 'ipk',

         CAST(d.ipk AS VARCHAR), CAST(i.ipk AS VARCHAR)

  FROM inserted i

  JOIN deleted d ON i.npm = d.npm

  WHERE i.ipk > d.ipk;  -- Hanya log jika IPK NAIK

END;

 

Pendekatan kondisional ini sangat efektif untuk mengurangi jumlah entri log yang tidak signifikan, sehingga tabel audit_log tetap ringkas dan mudah dianalisis.

 

3.4 Trigger BEFORE + RAISE untuk Validasi (Level 5)

Trigger validasi menggunakan mekanisme INSTEAD OF (setara BEFORE di SQL Server) dengan RAISERROR atau THROW untuk memblokir operasi DML yang melanggar aturan bisnis. Contoh berikut memproteksi tabel mahasiswa dari penghapusan data mahasiswa berprestasi (IPK >= 3.5):

 

CREATE TRIGGER trg_protect_mahasiswa_berprestasi

ON mahasiswa

INSTEAD OF DELETE

AS

BEGIN

  SET NOCOUNT ON;

  IF EXISTS (SELECT 1 FROM deleted WHERE ipk >= 3.5)

  BEGIN

    RAISERROR('GAGAL: Mahasiswa berprestasi tidak boleh dihapus!', 16, 1);

    RETURN;

  END

  DELETE FROM mahasiswa

  WHERE npm IN (SELECT npm FROM deleted);

END;

 

Kunci penting dari trigger ini adalah mekanisme RAISERROR yang melempar error dengan severity level 16, memastikan transaksi DML dibatalkan dan pesan kesalahan yang informatif dikirimkan kembali ke aplikasi pemanggil.

 

3.5 Trigger Multi-Statement (Level 6)

Trigger multi-statement memungkinkan satu trigger menjalankan beberapa aksi SQL sekaligus. Ini sangat berguna ketika satu peristiwa DML perlu memperbarui beberapa tabel atau mencatat beberapa aspek yang berbeda. Berikut adalah contoh trigger yang mencatat perubahan IPK sekaligus memperbarui tabel statistik:

 

CREATE TRIGGER trg_multi_upd_mahasiswa

ON mahasiswa

AFTER UPDATE

AS

BEGIN

  SET NOCOUNT ON;

  -- Aksi 1: Log perubahan IPK

  INSERT INTO audit_log(aksi, tabel_target, ref_key, kolom, nilai_lama, nilai_baru)

  SELECT 'UPDATE', 'mahasiswa', i.npm, 'ipk',

         CAST(d.ipk AS VARCHAR), CAST(i.ipk AS VARCHAR)

  FROM inserted i JOIN deleted d ON i.npm = d.npm

  WHERE d.ipk <> i.ipk;

  -- Aksi 2: Log perubahan status akademik

  INSERT INTO audit_log(aksi, tabel_target, ref_key, kolom, nilai_lama, nilai_baru)

  SELECT 'UPDATE', 'mahasiswa', i.npm, 'idstatusaka',

         CAST(d.idstatusaka AS VARCHAR), CAST(i.idstatusaka AS VARCHAR)

  FROM inserted i JOIN deleted d ON i.npm = d.npm

  WHERE d.idstatusaka <> i.idstatusaka;

END;


 

BAB IV: CONTOH KASUS-SISTEM MANAJEMEN PERPUSTAKAAN

4.1 Deskripsi Kasus

Perpustakaan Politeknik Negeri Lampung memerlukan sistem basis data yang dapat mencatat setiap peminjaman, pengembalian, dan perubahan status buku secara otomatis. Sistem ini juga harus mampu memvalidasi aturan bisnis, seperti mencegah peminjaman buku yang sudah habis stoknya dan memproteksi data buku langka dari penghapusan sembarangan.

 

Kasus ini mensimulasikan implementasi trigger dalam sistem manajemen perpustakaan yang realistis, menggabungkan konsep trigger AFTER, BEFORE/INSTEAD OF, kondisional WHEN, dan multi-statement dalam satu ekosistem database.

 

4.2 Skema Database Perpustakaan



4.3 DDL: Pembuatan Tabel





 

4.4 Trigger 1: AFTER INSERT - Catat Peminjaman Baru

Trigger ini otomatis mencatat setiap transaksi peminjaman baru ke tabel audit_perpustakaan dan sekaligus mengurangi stok buku yang dipinjam:

 






 

Trigger ini merupakan contoh multi-statement yang menggabungkan pencatatan audit dan pembaruan data stok dalam satu pemicu INSERT.

 

4.5 Trigger 2: BEFORE INSERT - Validasi Stok Buku

Trigger validasi ini memastikan bahwa buku yang dipinjam masih tersedia (stok > 0). Jika stok habis, operasi INSERT dibatalkan dengan pesan error yang jelas:

 

 










 

4.6 Trigger 3: AFTER UPDATE Kondisional - Monitor Status Peminjaman

Trigger kondisional ini hanya mencatat perubahan ke audit_log ketika status peminjaman berubah menjadi 'Terlambat', sehingga petugas dapat langsung memantau kasus keterlambatan tanpa dirusuhi entri log yang tidak relevan:


 





 

4.7 Trigger 4: INSTEAD OF DELETE - Proteksi Buku Langka

Trigger proteksi ini mencegah penghapusan buku yang ditandai sebagai langka (kolom langka = 1). Upaya penghapusan akan diblokir dan pesan peringatan dikirim kepada operator:

 


 


BAB V: PENUTUP


5.1 Kesimpulan

Berdasarkan pembahasan dan implementasi yang telah dilakukan, dapat ditarik beberapa kesimpulan penting:

 

    Trigger merupakan mekanisme yang sangat powerful untuk mengotomatisasi logika bisnis di tingkat database, tanpa bergantung pada aplikasi di sisi klien.

  Trigger AFTER paling tepat digunakan untuk audit trail karena data sudah tersimpan dengan pasti pada saat trigger dieksekusi, sehingga nilai yang dicatat dijamin akurat.

 Trigger BEFORE (INSTEAD OF) sangat efektif sebagai penjaga gerbang data, memungkinkan validasi dan proteksi data sebelum operasi DML benar-benar diterapkan.

   Penggunaan klausa kondisional (WHEN/IF) dalam trigger meningkatkan efisiensi sistem secara signifikan dengan memfilter hanya kejadian yang benar-benar relevan untuk dicatat.

  Trigger multi-statement memungkinkan orkestrasi beberapa aksi sekaligus dalam satu pemicu, menjaga konsistensi data di beberapa tabel secara atomik.

   Tabel virtual inserted dan deleted adalah komponen kunci dalam implementasi trigger SQL Server yang membedakannya dari pendekatan prosedural biasa.

 

5.2 Saran

    Gunakan SET NOCOUNT ON di setiap trigger sebagai praktik terbaik untuk menghindari overhead pesan output sistem.

  Selalu pertimbangkan penggunaan TRY...CATCH di dalam trigger untuk memastikan kegagalan pencatatan audit tidak mengganggu transaksi utama.

   Untuk sistem produksi berskala besar, pertimbangkan untuk mempartisi tabel audit_log berdasarkan periode waktu guna menjaga performa query.

   Dokumentasikan setiap trigger dengan komentar yang jelas, termasuk tujuan, tabel yang terlibat, dan kondisi pemicunya.

   Lakukan pengujian trigger secara menyeluruh termasuk skenario edge case seperti bulk insert, NULL values, dan operasi bertingkat.

 

DAFTAR PUSTAKA

Microsoft. (2024). CREATE TRIGGER (Transact-SQL). Microsoft Learn.

Modul Praktikum Pemrograman SQL II, Pertemuan 11: Trigger MySQL. (2026). Politeknik Negeri Lampung.

Ramakrishnan, R., & Gehrke, J. (2003). Database Management Systems (3rd ed.). McGraw-Hill.

Silberschatz, A., Korth, H. F., & Sudarshan, S. (2019). Database System Concepts (7th ed.). McGraw-Hill.

Tidak ada komentar:

Posting Komentar

Pertemuan 13