PostgreSQL - PEMICU

PostgreSQL Triggers adalah fungsi callback database, yang secara otomatis dijalankan / dipanggil saat peristiwa database tertentu terjadi.

Berikut ini adalah poin penting tentang pemicu PostgreSQL -

  • Pemicu PostgreSQL dapat ditentukan untuk diaktifkan

    • Sebelum operasi dicoba pada satu baris (sebelum batasan diperiksa dan INSERT, UPDATE atau DELETE dicoba)

    • Setelah operasi selesai (setelah kendala diperiksa dan INSERT, UPDATE, atau DELETE telah selesai)

    • Alih-alih operasi (dalam kasus penyisipan, pembaruan atau penghapusan pada tampilan)

  • Pemicu yang ditandai UNTUK SETIAP BARIS dipanggil sekali untuk setiap baris yang dimodifikasi oleh operasi. Sebaliknya, pemicu yang ditandai UNTUK SETIAP PERNYATAAN hanya dijalankan sekali untuk operasi tertentu, terlepas dari berapa banyak baris yang dimodifikasi.

  • Keduanya, klausa WHEN dan tindakan pemicu, dapat mengakses elemen dari baris yang sedang disisipkan, dihapus atau diperbarui menggunakan referensi formulir NEW.column-name dan OLD.column-name, dengan nama-kolom adalah nama kolom dari tabel yang terkait dengan pemicu.

  • Jika klausa WHEN diberikan, pernyataan PostgreSQL yang ditentukan hanya dijalankan untuk baris yang klausul WHEN benar. Jika tidak ada klausa WHEN yang diberikan, pernyataan PostgreSQL dijalankan untuk semua baris.

  • Jika beberapa pemicu dengan jenis yang sama ditentukan untuk peristiwa yang sama, pemicu tersebut akan diaktifkan dalam urutan abjad berdasarkan nama.

  • Kata kunci SEBELUM, SETELAH, atau BUKAN menentukan kapan tindakan pemicu akan dijalankan relatif terhadap penyisipan, modifikasi, atau penghapusan baris terkait.

  • Pemicu secara otomatis dihilangkan ketika tabel yang terkait dengan dijatuhkan.

  • Tabel yang akan dimodifikasi harus ada dalam database yang sama dengan tabel atau tampilan tempat pemicu dilampirkan dan harus digunakan saja tablenametidak database.tablename.

  • Opsi CONSTRAINT ketika ditentukan membuat pemicu batasan . Ini sama dengan pemicu biasa kecuali bahwa waktu pengaktifan pemicu dapat disesuaikan menggunakan SET CONSTRAINTS. Pemicu batasan diharapkan memunculkan pengecualian saat batasan yang mereka terapkan dilanggar.

Sintaksis

Sintaks dasar pembuatan file trigger adalah sebagai berikut -

CREATE  TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name
ON table_name
[
 -- Trigger logic goes here....
];

Sini, event_namebisa berupa operasi database INSERT, DELETE, UPDATE, dan TRUNCATE pada tabel yang disebutkantable_name. Anda secara opsional dapat menentukan UNTUK SETIAP BARIS setelah nama tabel.

Berikut ini adalah sintaks membuat pemicu pada operasi UPDATE pada satu atau beberapa kolom tertentu dari tabel sebagai berikut -

CREATE  TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name
ON table_name
[
 -- Trigger logic goes here....
];

Contoh

Mari kita pertimbangkan sebuah kasus di mana kami ingin menyimpan uji coba audit untuk setiap catatan yang dimasukkan ke dalam tabel PERUSAHAAN, yang akan kami buat baru sebagai berikut (Hapus tabel PERUSAHAAN jika Anda sudah memilikinya).

testdb=# CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

Untuk mempertahankan uji coba audit, kami akan membuat tabel baru bernama AUDIT di mana pesan log akan disisipkan setiap kali ada entri dalam tabel PERUSAHAAN untuk catatan baru -

testdb=# CREATE TABLE AUDIT(
   EMP_ID INT NOT NULL,
   ENTRY_DATE TEXT NOT NULL
);

Di sini, ID adalah ID record AUDIT, dan EMP_ID adalah ID, yang akan berasal dari tabel COMPANY, dan DATE akan menyimpan stempel waktu saat record akan dibuat di tabel COMPANY. Jadi sekarang, mari kita buat pemicu pada tabel PERUSAHAAN sebagai berikut -

testdb=# CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY
FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();

Dimana auditlogfunc () adalah PostgreSQL procedure dan memiliki definisi berikut -

CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$
   BEGIN
      INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp);
      RETURN NEW;
   END;
$example_table$ LANGUAGE plpgsql;

Sekarang, kita akan memulai pekerjaan sebenarnya. Mari kita mulai memasukkan catatan ke dalam tabel PERUSAHAAN yang seharusnya menghasilkan catatan log audit dalam tabel AUDIT. Jadi mari kita buat satu record di tabel COMPANY sebagai berikut -

testdb=# INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );

Ini akan membuat satu record dalam tabel COMPANY, yaitu sebagai berikut -

id | name | age | address      | salary
----+------+-----+--------------+--------
  1 | Paul |  32 | California   |  20000

Pada waktu yang sama, satu record akan dibuat dalam tabel AUDIT. Catatan ini adalah hasil dari sebuah pemicu, yang telah kita buat pada operasi INSERT pada tabel PERUSAHAAN. Demikian pula, Anda dapat membuat pemicu pada operasi UPDATE dan DELETE berdasarkan kebutuhan Anda.

emp_id |          entry_date
--------+-------------------------------
      1 | 2013-05-05 15:49:59.968+05:30
(1 row)

Mendaftar TRIGGERS

Anda dapat membuat daftar semua pemicu dalam database saat ini dari pg_trigger tabel sebagai berikut -

testdb=# SELECT * FROM pg_trigger;

Pernyataan PostgreSQL yang diberikan di atas akan mencantumkan semua pemicu.

Jika Anda ingin membuat daftar pemicu pada tabel tertentu, gunakan klausa AND dengan nama tabel sebagai berikut -

testdb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company';

Pernyataan PostgreSQL yang diberikan di atas juga akan mencantumkan hanya satu entri sebagai berikut -

tgname
-----------------
 example_trigger
(1 row)

Menjatuhkan TRIGGERS

Berikut ini adalah perintah DROP, yang dapat digunakan untuk menjatuhkan pemicu yang ada -

testdb=# DROP TRIGGER trigger_name;