SQLite
 sql >> Teknologi Basis Data >  >> RDS >> SQLite

Pemicu SQLite

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 , atau INSTEAD OF . Anda dapat membuat BEFORE dan AFTER pemicu di atas meja. Namun, Anda hanya dapat membuat INSTEAD OF pemicu pada tampilan.
  • Kemudian, tentukan peristiwa yang menyebabkan pemicu dipanggil seperti INSERT , UPDATE , atau DELETE .
  • 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLite - Ubah Tabel

  2. Cara Menambahkan Nilai Berbeda dengan SQLite Sum()

  3. SQLite FULL OUTER JOIN Emulation

  4. Bagaimana saya bisa memperbarui bidang pemintal saya dengan input pengguna di EditText

  5. Lampirkan String dalam Kutipan Tunggal di Hasil Query SQLite