SQLite - Tetikleyiciler

SQLite 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ğıda SQLite tetikleyicileriyle ilgili önemli noktalar verilmiştir -

  • SQLite tetikleyicisi, belirli bir veritabanı tablosunun bir DELETE, INSERT veya UPDATE işlemi gerçekleştiğinde veya bir tablonun bir veya daha fazla belirtilen sütununda bir GÜNCELLEME meydana geldiğinde etkinleşecek şekilde belirtilebilir.

  • Şu anda SQLite, FOR EACH STATEMENT tetikleyicilerini değil, yalnızca FOR EACH ROW tetikleyicilerini destekler. Bu nedenle, FOR EACH ROW'u açıkça belirtmek isteğe bağlıdır.

  • Hem WHEN yan tümcesi hem de tetikleme eylemleri, form 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.

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

  • BEFORE veya AFTER 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.

  • Özel bir SQL işlevi RAISE (), bir tetikleyici program içinde bir istisna oluşturmak için kullanılabilir.

Sözdizimi

Aşağıda, bir oluşturmanın temel sözdizimi verilmiştir. trigger.

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

Buraya, event_nameolabilir SİL INSERT, ve GÜNCELLEME 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 verilmiştir.

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

Misal

Aşağıdaki gibi yeni oluşturduğumuz COMPANY tablosuna eklenen her kayıt için denetim denemesini sürdürmek istediğimiz bir durumu düşünelim (Zaten sahipseniz COMPANY tablosunu bırakın).

sqlite> 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 tablosunda 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.

sqlite> 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 COMPANY tablosunda aşağıdaki gibi bir tetikleyici oluşturalım -

sqlite> CREATE TRIGGER audit_log AFTER INSERT 
ON COMPANY
BEGIN
   INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, datetime('now'));
END;

Şimdi fiili çalışmaya başlayacağız, ŞİRKET tablosuna kayıt eklemeye başlayalım, bu da AUDIT tablosunda bir denetim log kaydı oluşturmayla sonuçlanmalıdır. COMPANY tablosunda aşağıdaki gibi bir kayıt oluşturun -

sqlite> 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.0

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-04-05 06:26:00

Listeleme Tetikleyicileri

Tüm tetikleyicileri listeleyebilirsiniz. sqlite_master aşağıdaki tablo -

sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger';

Yukarıdaki SQLite deyimi aşağıdaki gibi yalnızca bir girişi listeleyecektir -

name
----------
audit_log

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

sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger' AND tbl_name = 'COMPANY';

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

name
----------
audit_log

Tetikleyicileri Düşürmek

Aşağıda, mevcut bir tetikleyiciyi bırakmak için kullanılabilecek DROP komutu yer almaktadır.

sqlite> DROP TRIGGER trigger_name;