Ringkasan :tutorial ini membahas pemicu SQLite, yaitu objek database yang diaktifkan secara otomatis saat data dalam tabel diubah.
Apa yang dimaksud dengan pemicu SQLite
Pemicu SQLite adalah objek database bernama yang dijalankan secara otomatis saat INSERT , UPDATE atau DELETE pernyataan dikeluarkan terhadap tabel terkait.
Kapan kita membutuhkan pemicu SQLite
Anda sering menggunakan pemicu untuk mengaktifkan audit yang canggih. Misalnya, Anda ingin mencatat perubahan dalam data sensitif seperti gaji dan alamat setiap kali berubah.
Selain itu, Anda menggunakan pemicu untuk menegakkan aturan bisnis yang kompleks secara terpusat di tingkat basis data dan mencegah transaksi yang tidak valid.
SQLite CREATE TRIGGER pernyataan
Untuk membuat pemicu baru di SQLite, gunakan CREATE TRIGGER pernyataan sebagai berikut:
CREATE TRIGGER [IF NOT EXISTS] trigger_name
[BEFORE|AFTER|INSTEAD OF] [INSERT|UPDATE|DELETE]
ON table_name
[WHEN condition]
BEGIN
statements;
END;Code language: SQL (Structured Query Language) (sql) Dalam sintaks ini:
- Pertama, tentukan nama pemicu setelah
CREATE TRIGGERkata kunci. - Selanjutnya, tentukan kapan pemicu diaktifkan seperti
BEFORE,AFTER, atauINSTEAD OF. Anda dapat membuatBEFOREdanAFTERpemicu di atas meja. Namun, Anda hanya dapat membuatINSTEAD OFpemicu pada tampilan. - Kemudian, tentukan peristiwa yang menyebabkan pemicu dipanggil seperti
INSERT,UPDATE, atauDELETE. - Setelah itu, tunjukkan tabel tempat pemicu berada.
- Terakhir, tempatkan logika pemicu di
BEGIN ENDblok, yang dapat berupa pernyataan SQL apa pun yang valid.
Jika Anda menggabungkan waktu saat pemicu dipicu dan peristiwa yang menyebabkan pemicu dipicu, Anda memiliki total 9 kemungkinan:
BEFORE INSERTAFTER INSERTBEFORE UPDATEAFTER UPDATEBEFORE DELETEAFTER DELETEINSTEAD OF INSERTINSTEAD OF DELETEINSTEAD OF UPDATE
Misalkan Anda menggunakan UPDATE pernyataan untuk memperbarui 10 baris dalam tabel, pemicu yang terkait dengan tabel dipecat 10 kali. Pemicu ini disebut FOR EACH ROW pemicu. Jika pemicu yang terkait dengan tabel dipicu satu kali, kami menyebut pemicu ini sebagai FOR EACH STATEMENT pemicu.
Pada versi 3.9.2, SQLite hanya mendukung FOR EACH ROW pemicu. Itu belum mendukung FOR EACH STATEMENT pemicu.
Jika Anda menggunakan kondisi di WHEN klausa, pemicu hanya dipanggil ketika kondisinya benar. Jika Anda menghilangkan WHEN klausa, pemicu dijalankan untuk semua baris.
Perhatikan bahwa jika Anda menjatuhkan tabel, semua pemicu terkait juga akan dihapus. Namun, jika pemicu mereferensikan tabel lain, pemicu tidak dihapus atau diubah jika tabel lain dihapus atau diperbarui.
Misalnya, pemicu merujuk ke tabel bernama people , Anda membuang people tabel atau ganti namanya, Anda perlu mengubah definisi pemicu secara manual.
Anda dapat mengakses data dari baris yang disisipkan, dihapus, atau diperbarui menggunakan OLD dan NEW referensi berupa:OLD.column_name dan NEW.column_name .
yang OLD dan NEW referensi tersedia tergantung pada peristiwa yang menyebabkan pemicu dipicu.
Tabel berikut mengilustrasikan aturannya.:
| Tindakan | Referensi |
|---|---|
| MASUKKAN | BARU tersedia |
| PERBARUI | Tersedia BARU dan LAMA |
| HAPUS | OLD tersedia |
SQLite memicu contoh
Mari buat tabel baru bernama prospek untuk menyimpan semua prospek bisnis perusahaan.
CREATE TABLE leads (
id integer PRIMARY KEY,
first_name text NOT NULL,
last_name text NOT NULL,
phone text NOT NULL,
email text NOT NULL,
source text NOT NULL
);Code language: SQL (Structured Query Language) (sql) 1) SQLite BEFORE INSERT contoh pemicu
Misalkan Anda ingin memvalidasi alamat email sebelum memasukkan prospek baru ke dalam leads meja. Dalam hal ini, Anda dapat menggunakan BEFORE INSERT pemicu.
Pertama, buat BEFORE INSERT pemicu sebagai berikut:
CREATE TRIGGER validate_email_before_insert_leads
BEFORE INSERT ON leads
BEGIN
SELECT
CASE
WHEN NEW.email NOT LIKE '%_@__%.__%' THEN
RAISE (ABORT,'Invalid email address')
END;
END;Code language: SQL (Structured Query Language) (sql)
Kami menggunakan kode NEW referensi untuk mengakses kolom email dari baris yang sedang disisipkan.
Untuk memvalidasi email, kami menggunakan LIKE operator untuk menentukan apakah email valid atau tidak berdasarkan pola email. Jika email tidak valid, RAISE fungsi membatalkan penyisipan dan mengeluarkan pesan kesalahan.
Kedua, masukkan baris dengan email yang tidak valid ke dalam leads tabel.
INSERT INTO leads (first_name,last_name,email,phone)
VALUES('John','Doe','jjj','4089009334');Code language: SQL (Structured Query Language) (sql) SQLite mengeluarkan kesalahan:"Alamat email tidak valid" dan membatalkan eksekusi penyisipan.
Ketiga, masukkan satu baris dengan email yang valid.
INSERT INTO leads (first_name, last_name, email, phone)
VALUES ('John', 'Doe', 'john.doe@sqlitetutorial.net', '4089009334');Code language: SQL (Structured Query Language) (sql) Karena emailnya valid, pernyataan insert berhasil dieksekusi.
SELECT
first_name,
last_name,
email,
phone
FROM
leads;Code language: SQL (Structured Query Language) (sql)
2) SQLite AFTER UPDATE contoh pemicu
Telepon dan email prospek sangat penting sehingga Anda tidak boleh kehilangan informasi ini. Misalnya, seseorang secara tidak sengaja memperbarui email atau telepon ke yang salah atau bahkan menghapusnya.
Untuk melindungi data berharga ini, Anda menggunakan pemicu untuk mencatat semua perubahan yang dibuat pada ponsel dan email.
Pertama, buat tabel baru bernama lead_logs untuk menyimpan data historis.
CREATE TABLE lead_logs (
id INTEGER PRIMARY KEY,
old_id int,
new_id int,
old_phone text,
new_phone text,
old_email text,
new_email text,
user_action text,
created_at text
);Code language: SQL (Structured Query Language) (sql)
Kedua, buat AFTER UPDATE pemicu untuk mencatat data ke lead_logs tabel setiap kali ada pembaruan di email atau phone kolom.
CREATE TRIGGER log_contact_after_update
AFTER UPDATE ON leads
WHEN old.phone <> new.phone
OR old.email <> new.email
BEGIN
INSERT INTO lead_logs (
old_id,
new_id,
old_phone,
new_phone,
old_email,
new_email,
user_action,
created_at
)
VALUES
(
old.id,
new.id,
old.phone,
new.phone,
old.email,
new.email,
'UPDATE',
DATETIME('NOW')
) ;
END;Code language: SQL (Structured Query Language) (sql)
Anda perhatikan bahwa dalam kondisi di WHEN klausa menetapkan bahwa pemicu dipanggil hanya bila ada perubahan di kolom email atau telepon.
Ketiga, perbarui nama belakang John dari Doe ke Smith .
UPDATE leads
SET
last_name = 'Smith'
WHERE
id = 1;Code language: SQL (Structured Query Language) (sql)
Pemicu log_contact_after_update tidak dipanggil karena tidak ada perubahan di email atau telepon.
Keempat, perbarui email dan telepon John ke yang baru.
UPDATE leads
SET
phone = '4089998888',
email = 'john.smith@sqlitetutorial.net'
WHERE
id = 1;Code language: SQL (Structured Query Language) (sql) Jika Anda memeriksa tabel log, Anda akan melihat ada entri baru di sana.
SELECT
old_phone,
new_phone,
old_email,
new_email,
user_action
FROM
lead_logs;Code language: SQL (Structured Query Language) (sql)
Anda dapat mengembangkan AFTER INSERT dan AFTER DELETE pemicu untuk mencatat data di lead_logs tabel sebagai latihan.
SQLite DROP TRIGGER pernyataan
Untuk menghapus pemicu yang ada, gunakan DROP TRIGGER pernyataan sebagai berikut:
DROP TRIGGER [IF EXISTS] trigger_name;Code language: SQL (Structured Query Language) (sql) Dalam sintaks ini:
- Pertama, tentukan nama pemicu yang ingin Anda jatuhkan setelah
DROP TRIGGERkata kunci. - Kedua, gunakan
IF EXISTSopsi untuk menghapus pemicu hanya jika ada.
Perhatikan bahwa jika Anda menjatuhkan tabel, SQLite akan secara otomatis menghapus semua pemicu yang terkait dengan tabel tersebut.
Misalnya, untuk menghapus validate_email_before_insert_leads pemicu, Anda menggunakan pernyataan berikut:
DROP TRIGGER validate_email_before_insert_leads;Code language: SQL (Structured Query Language) (sql) Dalam tutorial ini, kami telah memperkenalkan Anda pada pemicu SQLite dan menunjukkan cara membuat dan melepaskan pemicu dari database.