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 TRIGGER
kata kunci. - Selanjutnya, tentukan kapan pemicu diaktifkan seperti
BEFORE
,AFTER
, atauINSTEAD OF
. Anda dapat membuatBEFORE
danAFTER
pemicu di atas meja. Namun, Anda hanya dapat membuatINSTEAD OF
pemicu 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 END
blok, 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 INSERT
AFTER INSERT
BEFORE UPDATE
AFTER UPDATE
BEFORE DELETE
AFTER DELETE
INSTEAD OF INSERT
INSTEAD OF DELETE
INSTEAD 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', '[email protected]', '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 = '[email protected]'
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 TRIGGER
kata kunci. - Kedua, gunakan
IF EXISTS
opsi 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.