Mengaudit Tabel dengan Pemicu
Bangun jejak audit dengan pemicu AFTER INSERT/UPDATE/DELETE yang menulis ke tabel audit_log
Mengaudit Tabel dengan Pemicu adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.
Mengapa Melakukan Audit?
Log audit menjawab "siapa mengubah apa, kapan". Diperlukan untuk kepatuhan (HIPAA, SOX, investigasi hak penghapusan berdasarkan GDPR) dan forensik operasional.
Tabel Audit
Satu tabel pusat mencatat setiap perubahan:
CREATE TABLE audit_log (
id BIGSERIAL PRIMARY KEY,
ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
user_name TEXT NOT NULL DEFAULT CURRENT_USER,
table_name TEXT NOT NULL,
action TEXT NOT NULL, -- INSERT, UPDATE, DELETE
row_id TEXT,
old_data JSONB,
new_data JSONB
);Fungsi Pemicu Audit
Satu fungsi yang dapat digunakan kembali di banyak tabel:
CREATE OR REPLACE FUNCTION audit_row()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO audit_log (table_name, action, row_id, old_data, new_data)
VALUES (
TG_TABLE_NAME,
TG_OP,
COALESCE(NEW.id::TEXT, OLD.id::TEXT),
CASE WHEN TG_OP IN ('UPDATE','DELETE') THEN to_jsonb(OLD) END,
CASE WHEN TG_OP IN ('INSERT','UPDATE') THEN to_jsonb(NEW) END
);
RETURN COALESCE(NEW, OLD);
END;
$$ LANGUAGE plpgsql;Pasang ke Tabel
Buat pemicu pada AFTER INSERT/UPDATE/DELETE:
CREATE TRIGGER trg_audit_users
AFTER INSERT OR UPDATE OR DELETE ON users
FOR EACH ROW EXECUTE FUNCTION audit_row();to_jsonb(NEW)
Trik to_jsonb menangkap seluruh baris secara generik — tanpa kode per kolom. Berfungsi untuk tabel apa pun yang memiliki kolom id.
Melacak Pelaku
Jika aplikasi berjalan sebagai satu pengguna basis data, CURRENT_USER tidak cukup. Teruskan pengguna aplikasi melalui GUC sesi:
-- App sets:
SET LOCAL app.user_id = '42';
-- Trigger reads:
INSERT INTO audit_log (... actor_id ...) VALUES (..., current_setting('app.user_id', true)::BIGINT);Mengaudit Kolom Tertentu
Gunakan klausa WHEN pada pemicu untuk audit selektif:
CREATE TRIGGER trg_audit_role_change
AFTER UPDATE OF role ON users
FOR EACH ROW WHEN (OLD.role IS DISTINCT FROM NEW.role)
EXECUTE FUNCTION audit_role_change();Tabel Audit per Tabel
Alternatifnya: satu tabel audit untuk setiap tabel nyata (misalnya users_audit) dengan skema dan metadata audit yang sama. Lebih mudah dikueri, tetapi memerlukan lebih banyak DDL untuk dipelihara.
Audit Hanya Perubahan
Simpan hanya kolom yang berubah:
INSERT INTO audit_log (table_name, action, changes)
VALUES (
TG_TABLE_NAME, TG_OP,
(SELECT jsonb_object_agg(key, value)
FROM jsonb_each(to_jsonb(NEW))
WHERE NEW.* IS DISTINCT FROM OLD.* AND to_jsonb(NEW)->key IS DISTINCT FROM to_jsonb(OLD)->key)
);Performa Tabel Audit
Tabel audit berkembang cepat pada sistem yang sibuk. Partisikan berdasarkan waktu:
CREATE TABLE audit_log (...) PARTITION BY RANGE (ts);
CREATE TABLE audit_log_2024_q1 PARTITION OF audit_log
FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');Pertukaran Performa
Setiap insert/update/delete kini menulis baris kedua. Untuk tabel yang sangat sering ditulisi, hal ini dapat menggandakan IO. Uji, pantau, lalu tentukan apakah pertukaran ini sepadan.
Kapan Tidak Menggunakan Pemicu Basis Data
Jika Anda memerlukan integrasi bus peristiwa, antrekan peristiwa dengan NOTIFY atau LISTEN, atau gunakan alat replikasi logis / CDC (Debezium), bukan pemicu.
Ringkasan
Pemicu audit adalah cara paling sederhana untuk menangkap riwayat.
- Satu fungsi generik dengan to_jsonb(NEW/OLD)
- Pasang ke setiap tabel yang diaudit
- Partisikan tabel audit berdasarkan waktu
- Lacak pelaku aplikasi secara eksplisit melalui GUC
Cek Cepat
Di dalam fungsi pemicu audit, bagaimana Anda menangkap baris baru sebagai JSONB secara generik?
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengaudit Tabel dengan Pemicu” gratis?
Ya — teks lengkap “Mengaudit Tabel dengan Pemicu” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Academy, upgrade ke CoddyKit PRO. Kursus SQL Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mengaudit Tabel dengan Pemicu”?
Bangun jejak audit dengan pemicu AFTER INSERT/UPDATE/DELETE yang menulis ke tabel audit_log Kamu berlatih SQL Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai SQL Academy?
Tidak diperlukan pengalaman sebelumnya. SQL Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Mengaudit Tabel dengan Pemicu” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Academy ini?
Ya. Setiap pelajaran SQL Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Anatomi Pemicu: BEFORE/AFTER, FOR EACH ROW
- Dasar-Dasar Fungsi PL/pgSQL
- Blok DO dan Kode Anonim
- Mengaudit Tabel dengan Pemicu