PostgreSQL - TETİKLER

PostgreSQL Triggers , belirli bir veritabanı olayı gerçekleştiğinde otomatik olarak gerçekleştirilen / çağrılan veritabanı geri çağırma işlevleridir.

Aşağıdakiler, PostgreSQL tetikleyicileri hakkında önemli noktalardır -

  • PostgreSQL tetikleyicisi ateşlemek için belirtilebilir

    • İşlem bir satırda denenmeden önce (kısıtlamalar kontrol edilmeden ve INSERT, UPDATE veya DELETE denenmeden önce)

    • İşlem tamamlandıktan sonra (kısıtlamalar kontrol edildikten ve INSERT, UPDATE veya DELETE tamamlandıktan sonra)

    • İşlem yerine (bir görünümde ekleme, güncelleme veya silme olması durumunda)

  • HER SATIR İÇİN işaretlenmiş bir tetikleyici, işlemin değiştirdiği her satır için bir kez çağrılır. Buna karşılık, HER İFADE İÇİN işaretlenmiş bir tetikleyici, kaç satırı değiştirdiğine bakılmaksızın, herhangi bir işlem için yalnızca bir kez yürütülür.

  • Hem WHEN cümlesi hem de tetikleyici eylemler, formun referansları kullanılarak eklenen, silinen veya güncellenen satırın öğelerine erişebilir. NEW.column-name ve OLD.column-name, sütun adı, tetikleyicinin ilişkilendirildiği tablodaki bir sütunun adıdır.

  • Bir WHEN yan tümcesi sağlanırsa, belirtilen PostgreSQL deyimleri yalnızca WHEN yan tümcesinin doğru olduğu satırlar için çalıştırılır. WHEN yan tümcesi sağlanmadıysa, PostgreSQL deyimleri tüm satırlar için yürütülür.

  • Aynı olay için aynı türden birden çok tetikleyici tanımlanırsa, bunlar ada göre alfabetik sırada tetiklenir.

  • ÖNCE, SONRA veya INSTEAD OF anahtar sözcüğü, tetikleyici eylemlerin ilişkili satırın eklenmesine, değiştirilmesine veya kaldırılmasına göre ne zaman yürütüleceğini belirler.

  • Tetikleyiciler, ilişkili oldukları tablo bırakıldığında otomatik olarak düşer.

  • Değiştirilecek tablo, tetikleyicinin eklendiği tablo veya görünümle aynı veritabanında bulunmalı ve yalnızca tablename, değil database.tablename.

  • Bir CONSTRAINT seçeneği belirtildiğinde bir kısıtlama tetikleyicisi oluşturur . Bu, tetik ateşlemesinin zamanlamasının KISITLAMALARI AYARLA kullanılarak ayarlanabilmesi dışında normal tetikleme ile aynıdır. Kısıt tetikleyicilerinin, uyguladıkları kısıtlamalar ihlal edildiğinde bir istisna oluşturmaları beklenir.

Sözdizimi

Bir oluşturmanın temel sözdizimi trigger aşağıdaki gibidir -

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

Buraya, event_nameolabilir INSERT, DELETE, UPDATE, ve KESILMESINDEN söz masaya veritabanı işlemitable_name. İsteğe bağlı olarak, tablo adından sonra FOR EACH ROW belirtebilirsiniz.

Aşağıda, bir tablonun belirtilen bir veya daha fazla sütununda bir UPDATE işleminde bir tetikleyici oluşturmanın sözdizimi aşağıdaki gibidir -

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

Misal

ŞİRKET tablosuna eklenen her kayıt için denetim denemesini sürdürmek istediğimiz bir durumu düşünelim, aşağıdaki gibi yeni oluşturacağız (Zaten varsa ŞİRKET tablosunu bırakın).

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

Denetim denemesini sürdürmek için, COMPANY tablosuna yeni bir kayıt için bir giriş olduğunda günlük mesajlarının ekleneceği AUDIT adlı yeni bir tablo oluşturacağız -

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

Burada ID, AUDIT kayıt ID'sidir ve EMP_ID, COMPANY tablosundan gelecek olan ID'dir ve DATE, kayıt COMPANY tablosunda oluşturulduğunda zaman damgasını tutacaktır. Şimdi, ŞİRKET tablosunda aşağıdaki gibi bir tetikleyici oluşturalım -

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

Auditlogfunc () bir PostgreSQL olduğunda procedure ve aşağıdaki tanıma sahiptir -

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;

Şimdi asıl işe başlayacağız. ŞİRKET tablosuna kayıt eklemeye başlayalım, bu da AUDIT tablosunda bir denetim günlük kaydı oluşturmayla sonuçlanmalıdır. Öyleyse COMPANY tablosunda aşağıdaki gibi bir kayıt oluşturalım -

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

Bu, COMPANY tablosunda aşağıdaki gibi bir kayıt oluşturacaktır -

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

Aynı zamanda, AUDIT tablosunda bir kayıt oluşturulacaktır. Bu kayıt, COMPANY tablosundaki INSERT işleminde oluşturduğumuz bir tetikleyicinin sonucudur. Benzer şekilde, tetikleyicilerinizi gereksinimlerinize göre UPDATE ve DELETE işlemlerinde oluşturabilirsiniz.

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

TRIGGERS Listeleme

Mevcut veritabanındaki tüm tetikleyicileri şuradan listeleyebilirsiniz: pg_trigger aşağıdaki tablo -

testdb=# SELECT * FROM pg_trigger;

Yukarıda verilen PostgreSQL ifadesi tüm tetikleyicileri listeleyecektir.

Belirli bir tablodaki tetikleyicileri listelemek istiyorsanız, aşağıdaki gibi tablo adıyla AND yan tümcesini kullanın -

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

Yukarıda verilen PostgreSQL ifadesi ayrıca aşağıdaki gibi yalnızca bir girişi listeleyecektir -

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

TRIGGERS'ı düşürme

Aşağıda, mevcut bir tetiği bırakmak için kullanılabilecek DROP komutu verilmiştir -

testdb=# DROP TRIGGER trigger_name;