$title =

Memahami Function dan Trigger MySQL untuk Otomatisasi

;

$content = [


πŸ“˜ Pengenalan Function di SQL (MySQL)


βš–οΈ Perbedaan Function, Procedure, dan Trigger

AspekFunctionProcedureTrigger
Return Valueβœ… Wajib mengembalikan 1 nilai❌ Tidak wajib return nilai❌ Tidak return, hanya menjalankan aksi
PemanggilanDi dalam query (SELECT, WHERE, dll)Dengan CALLOtomatis saat INSERT/UPDATE/DELETE
Tujuan UtamaPerhitungan, transformasi, konversiMenangani logika kompleksTindakan otomatis setelah event DB
Bisa Ubah Data❌ Tidak bolehβœ… Bolehβœ… Boleh
Contoh PenggunaanSELECT fungsi(...)CALL prosedur(...)Aktif otomatis

πŸ” Apa Itu Function di SQL?

Function (fungsi) di SQL adalah blok kode yang menerima input dan mengembalikan 1 nilai sebagai hasil. Biasanya digunakan untuk menghitung, mengubah, atau mengevaluasi sesuatu β€” dan bisa dipakai berulang kali di query.


🧠 Best Practice Function

  • βœ… Fokus pada satu tugas: perhitungan atau pengecekan.
  • πŸ” Gunakan jika fungsinya sering dipakai ulang di banyak query.
  • πŸ“Œ Hindari melakukan perubahan data (INSERT, UPDATE, DELETE) di dalam function.
  • 🧼 Gunakan nama yang deskriptif dan jelas.
  • πŸš€ Tambahkan kata DETERMINISTIC jika hasil dari input yang sama selalu sama.

πŸ› οΈ Format Umum Function di MySQL

DELIMITER //
CREATE FUNCTION nama_function(parameter TipeData)
RETURNS TipeData
DETERMINISTIC
BEGIN
  -- logika
  RETURN hasil;
END //
DELIMITER ;

`


πŸ§ͺ Contoh Function

1️⃣ Function 

ppn(harga)

 β€” Hitung Harga + PPN 11%

Fungsi ini menambahkan PPN 11% ke suatu harga. Misalnya, jika harga 100.000 β†’ hasilnya 111.000

DELIMITER //
CREATE FUNCTION ppn(harga DOUBLE)
RETURNS DOUBLE
DETERMINISTIC
BEGIN
  RETURN harga * 1.11;
END //
DELIMITER ;

🧾 Contoh Pemakaian:

SELECT ppn(100000); -- hasil: 111000

2️⃣ Function 

cek_owner(owner_id)

 β€” Deteksi Jenis Owner

Fungsi ini mengembalikan:

  • ‘inn’ jika owner_id = 28
  • ‘mitra’ jika bukan 28
DELIMITER //
CREATE FUNCTION cek_owner(owner_id INT)
RETURNS VARCHAR(10)
DETERMINISTIC
BEGIN
  IF owner_id = 28 THEN
    RETURN 'inn';
  ELSE
    RETURN 'mitra';
  END IF;
END //
DELIMITER ;

🧾 Contoh Pemakaian di Query:

SELECT 
  id_depo,
  nama_depo,
  owner_id,
  cek_owner(owner_id) AS tipe_owner
FROM depo;

Hasilnya akan ada kolom tambahan tipe_owner yang berisi ‘inn’ atau ‘mitra’.


πŸ“‹ Cara Cek dan Hapus Function

  • βœ… Lihat semua function di database:
SHOW FUNCTION STATUS WHERE Db = 'nama_database';
  • πŸ—‘οΈ Hapus function jika perlu:
DROP FUNCTION IF EXISTS nama_function;

🧠 Rangkuman

HalPenjelasan Singkat
Fungsi SQLBlok logika yang menerima input dan mengembalikan 1 nilai
TujuanPerhitungan, format data, validasi ringan
KeunggulanBisa dipakai ulang, hemat penulisan query
Tidak CocokUntuk proses yang ubah data (gunakan procedure/trigger)

🧠 Panduan Lengkap MySQL TRIGGER

πŸ“Œ Apa Itu TRIGGER?

TRIGGER adalah fitur di MySQL yang memungkinkan kita mengeksekusi perintah SQL secara otomatis ketika terjadi perubahan pada suatu tabel. Perubahan ini bisa berupa INSERT, UPDATE, atau DELETE.

Trigger berguna untuk:

  • Logging otomatis
  • Backup data sebelum dihapus/diubah
  • Validasi atau modifikasi nilai sebelum disimpan

βš™οΈ Struktur Umum TRIGGER

CREATE TRIGGER nama_trigger
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON nama_tabel
FOR EACH ROW
BEGIN
  -- Aksi SQL
END;

`

ElemenFungsi
BEFORETrigger jalan sebelum perubahan
AFTERTrigger jalan setelah perubahan
INSERT, UPDATE, DELETEJenis perubahan data
FOR EACH ROWTrigger dijalankan untuk setiap baris
NEWData baru (setelah perubahan)
OLDData lama (sebelum perubahan)

βœ… Kelebihan Trigger

  • Otomatisasi: Mengurangi kebutuhan kode aplikasi untuk tugas-tugas berulang (misalnya backup, logging).
  • Konsistensi Data: Validasi dan pembersihan data bisa dipastikan di level database.
  • Audit Trail: Perubahan pada data bisa langsung dicatat otomatis ke tabel log.
  • Pencegahan Error: Bisa mencegah input nilai yang salah, seperti stok negatif, sebelum data disimpan.

⚠️ Kekurangan Trigger

  • Sulit Dideteksi Saat Error: Jika ada kesalahan dalam kode trigger, proses INSERT, UPDATE, atau DELETE bisa gagal tanpa error yang jelas di level aplikasi.
  • Sulit Debugging: Perubahan data terjadi β€œdi belakang layar”, menyulitkan pengembang untuk melacak apa yang salah.
  • Memperlambat Proses Transaksi: Di tabel dengan trafik tinggi, seperti tabel transaksi (sales, orders, dll), penggunaan trigger dapat memperlambat kinerja, terutama jika logika trigger berat.
  • Terbatas Satu Jenis per Aksi: Hanya bisa ada 1 trigger per jenis aksi per tabel (misal hanya 1 BEFORE UPDATE di tabel produk).
  • Tidak Bisa Commit/Rollback dalam Trigger.
  • Tidak Support Langsung Multi-Table Cascade Logic seperti di foreign key.


🧠 Penjelasan 

OLD dan NEW di Trigger MySQL

Jenis TriggerBisa Pakai OLD?Bisa Pakai NEW?
BEFORE INSERT❌ Tidak bisaβœ… Bisa
AFTER INSERT❌ Tidak bisaβœ… Bisa
BEFORE UPDATEβœ… Bisaβœ… Bisa
AFTER UPDATEβœ… Bisaβœ… Bisa
BEFORE DELETEβœ… Bisa❌ Tidak bisa
AFTER DELETEβœ… Bisa❌ Tidak bisa

βœ… NEW digunakan untuk data baru

Contoh: data yang akan atau baru saja disimpan

βœ… OLD digunakan untuk data lama

Contoh: data yang akan diubah atau akan dihapus


πŸ“Œ 1. BEFORE INSERT

CREATE TRIGGER before_insert_user
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
  -- ❌ OLD tidak bisa dipakai (data lama belum ada)
  -- βœ… NEW bisa dipakai untuk ubah data yang akan disimpan
  SET NEW.created_at = NOW();
END;

πŸ” Penjelasan:

Sebelum data disimpan ke tabel, kita bisa β€œmenyentuh” NEW, karena itu data yang akan disimpan. Tapi tidak ada OLD, karena sebelumnya belum ada data.


πŸ“Œ 2. AFTER INSERT

CREATE TRIGGER after_insert_log
AFTER INSERT ON transaksi
FOR EACH ROW
BEGIN
  -- ❌ OLD tidak tersedia
  -- βœ… NEW bisa dipakai untuk log
  INSERT INTO transaksi_log (trx_id, aksi)
  VALUES (NEW.id, 'INSERT');
END;

πŸ” Penjelasan:

Setelah data disimpan, kita bisa akses data barunya lewat NEW, misalnya untuk dicatat ke log. Tapi tidak ada OLD karena tidak ada data lama.


πŸ“Œ 3. BEFORE UPDATE

CREATE TRIGGER before_update_produk
BEFORE UPDATE ON produk
FOR EACH ROW
BEGIN
  -- βœ… OLD = nilai sebelum update
  -- βœ… NEW = nilai yang akan ditulis
  IF NEW.harga < OLD.harga THEN
    SET NEW.diskon = OLD.harga - NEW.harga;
  END IF;
END;

πŸ” Penjelasan:

Kita bisa bandingkan nilai lama (OLD) dan nilai baru (NEW) sebelum update terjadi.


πŸ“Œ 4. AFTER UPDATE

CREATE TRIGGER after_update_status
AFTER UPDATE ON orders
FOR EACH ROW
BEGIN
  -- βœ… OLD = status lama
  -- βœ… NEW = status baru
  INSERT INTO order_log (order_id, dari_status, ke_status)
  VALUES (NEW.id, OLD.status, NEW.status);
END;

πŸ” Penjelasan:

Setelah update berhasil, kita bisa simpan histori perubahan dengan membandingkan OLD dan NEW.


πŸ“Œ 5. BEFORE DELETE

CREATE TRIGGER before_delete_user
BEFORE DELETE ON users
FOR EACH ROW
BEGIN
  -- βœ… OLD = data yang akan dihapus
  -- ❌ NEW tidak ada (data baru tidak ada karena ini DELETE)
  INSERT INTO deleted_users (nama, email)
  VALUES (OLD.nama, OLD.email);
END;

πŸ” Penjelasan:

Sebelum data dihapus, kita hanya bisa akses OLD, karena tidak akan ada data baru (NEW tidak relevan di sini).


πŸ“Œ 6. AFTER DELETE

CREATE TRIGGER after_delete_produk
AFTER DELETE ON produk
FOR EACH ROW
BEGIN
  -- βœ… OLD = data yang baru saja dihapus
  -- ❌ NEW tidak ada
  INSERT INTO produk_log (produk_id, aksi)
  VALUES (OLD.id, 'DELETED');
END;

πŸ” Penjelasan:

Setelah data dihapus, kita masih bisa akses data lama (OLD) yang tadi dihapus. Tapi tidak ada NEW karena data baru tidak ada.


🧾 Kesimpulan Intuitif

AksiLogikaBisa akses OLD?Bisa akses NEW?
INSERTData baru ditambahkan❌ Tidak ada data lamaβœ… Data yang akan disimpan
UPDATEData lama diganti dengan baruβœ… Data sebelum updateβœ… Data baru
DELETEData lama dihapusβœ… Data yang akan dihapus❌ Tidak ada data baru

Kalau Mas San mau, Bam bisa tambahkan penjelasan ini ke file Markdown yang kemarin, atau bantu buat versi visual/diagram alurnya juga. Gimana?

πŸ” Manajemen Trigger

Lihat Semua Trigger

SHOW TRIGGERS;

Hapus Trigger

DROP TRIGGER IF EXISTS nama_trigger;

🎯 Kapan Menggunakan Trigger?

SituasiGunakan Trigger?
Backup otomatisβœ…
Logging histori perubahanβœ…
Validasi data yang kompleksβœ…
Tabel transaksi berisi ribuan query/detik⚠️ hati-hati
Proyek kecil/menengah dengan data pentingβœ…
Ingin semua logic terlihat di kode backend❌

🧩 Tips Praktis

  • Gunakan nama trigger yang deskriptif: before_insert_log, after_update_stock.
  • Pisahkan trigger berat ke job async jika performa jadi isu.
  • Selalu test trigger di dev environment sebelum deploy ke production.
  • Tambahkan logging di trigger untuk melacak error/aktivitas.

πŸ“Œ Penutup

TRIGGER adalah alat yang powerful untuk memastikan database berjalan otomatis dan terjaga. Namun, ia ibarat pedang bermata dua β€” salah sedikit bisa membuat data gagal masuk, atau bahkan memperlambat sistem tanpa disadari. Gunakan dengan bijak dan terukur.


];

$date =

;

$category =

,

;

$author =

;