Pelajaran modul (3/4)
Pengantar pemicu
Pemicu adalah kotak ajaib (sensor) yang secara otomatis menjalankan logika SEBELUM atau SETELAH peristiwa penyisipan, pembaruan, atau penghapusan data.\nSebelum mengajarkan tabel untuk bereaksi, kita perlu memberinya "Fungsi Pemicu" khusus yang ditulis dalam PL/pgSQL yang harus diakhiri dengan mengembalikan format sintetis yang disebut "TRIGGER".
Fungsi-fungsi ini tidak menerima argumen normal dalam tanda kurung; sebaliknya mereka menawarkan objek bawaan ajaib NEW dan OLD secara gratis, yang berisi data baris asli atau masuk dari tabel yang diawasi sensor!
CREATE OR REPLACE FUNCTION audit_deletions()
RETURNS TRIGGER AS $$
BEGIN
-- OLD.id is magically the id value of the poor record being deleted
INSERT INTO audit_log (table_name, record_id, action)
VALUES (TG_TABLE_NAME, OLD.id, 'DELETE');
RETURN OLD; -- Triggers before a Delete route must grant the exit
END;
$$ LANGUAGE plpgsql;Prosedur ini melakukan kerja keras menulis ke log. Nantinya, pada langkah kedua, itu akan ditransfer secara permanen ke event di tabel yang ingin kita lindungi.
Cobalah sendiri
Kami perlu melindungi pelanggan: tidak seorang pun yang berusia di bawah 18 tahun (pemeriksaan virtual kami) atau, di luar logika fiksi, kami ingin memaksa string 'first_name' yang diteruskan pada waktu INSERT untuk selalu disimpan dalam huruf besar di database, mengabaikan format klien JS apa pun.\nTulis Fungsi Pemicu yang disebut 'force_uppercase_name()'. Ia tidak menerima argumen ().\nIa mengembalikan TRIGGER. Buat templat isi.\nTetapkan paksa seluruh objek yang masuk melalui penetapan ajaib 'NEW.first_name = UPPER(NEW.first_name);'. Kemudian RETURN variabel BARU yang dibentuk ulang.
Tunjukkan petunjuk
BUAT ATAU GANTI FUNGSI force_uppercase_name() KEMBALIKAN PEMICU SEBAGAI $$ BEGIN NEW.first_name = UPPER(NEW.first_name); KEMBALI BARU; AKHIR; $$ BAHASA plpgsql;
Solusi tersedia setelah 3 upaya
Buat Fungsi Pemicu 'protect_price_drops()' yang memblokir pembaruan berbahaya saat penyerang akan menghemat harga produk yang sangat rendah.\nGunakan logika seperti 'IF NEW.unit_price < OLD.unit_price THEN', memunculkan pengecualian asli yang membuat semuanya mogok.\nPengecualian PL/pgSQL yang fatal menggunakan bentuk 'RAISE EXCEPTION ''Prezzo non abbassabile!'';'.
Tunjukkan petunjuk
BEGIN IF NEW.unit_price < OLD.unit_price THEN NAIKKAN PENGECUALIAN 'Prezzo non abbassabile!'; AKHIR JIKA; KEMBALI BARU; AKHIR;
Solusi tersedia setelah 3 upaya