SQLite
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> SQLite

Trình kích hoạt SQLite

Tóm tắt :hướng dẫn này thảo luận về trình kích hoạt SQLite, là một đối tượng cơ sở dữ liệu được kích hoạt tự động khi dữ liệu trong bảng được thay đổi.

Trình kích hoạt SQLite là gì

Trình kích hoạt SQLite là một đối tượng cơ sở dữ liệu được đặt tên được thực thi tự động khi INSERT , UPDATE hoặc DELETE câu lệnh được đưa ra dựa trên bảng được liên kết.

Khi nào chúng ta cần trình kích hoạt SQLite

Bạn thường sử dụng trình kích hoạt để cho phép kiểm tra phức tạp. Ví dụ:bạn muốn ghi lại những thay đổi trong dữ liệu nhạy cảm như tiền lương và địa chỉ bất cứ khi nào nó thay đổi.

Ngoài ra, bạn sử dụng trình kích hoạt để thực thi các quy tắc kinh doanh phức tạp một cách tập trung ở cấp cơ sở dữ liệu và ngăn chặn các giao dịch không hợp lệ.

SQLite CREATE TRIGGER tuyên bố

Để tạo một trình kích hoạt mới trong SQLite, bạn sử dụng CREATE TRIGGER tuyên bố như sau:

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)

Trong cú pháp này:

  • Đầu tiên, hãy chỉ định tên của trình kích hoạt sau CREATE TRIGGER từ khóa.
  • Tiếp theo, xác định thời điểm trình kích hoạt được kích hoạt, chẳng hạn như BEFORE , AFTER hoặc INSTEAD OF . Bạn có thể tạo BEFOREAFTER kích hoạt trên bàn. Tuy nhiên, bạn chỉ có thể tạo một INSTEAD OF kích hoạt một lượt xem.
  • Sau đó, chỉ định sự kiện khiến trình kích hoạt được gọi, chẳng hạn như INSERT , UPDATE hoặc DELETE .
  • Sau đó, chỉ ra bảng mà trình kích hoạt thuộc về.
  • Cuối cùng, đặt logic trình kích hoạt trong BEGIN END khối, có thể là bất kỳ câu lệnh SQL hợp lệ nào.

Nếu bạn kết hợp thời gian khi trình kích hoạt được kích hoạt và sự kiện khiến trình kích hoạt được kích hoạt, bạn có tổng cộng 9 khả năng:

  • BEFORE INSERT
  • AFTER INSERT
  • BEFORE UPDATE
  • AFTER UPDATE
  • BEFORE DELETE
  • AFTER DELETE
  • INSTEAD OF INSERT
  • INSTEAD OF DELETE
  • UPDATE

Giả sử bạn sử dụng UPDATE để cập nhật 10 hàng trong bảng, trình kích hoạt liên kết với bảng được kích hoạt 10 lần. Trình kích hoạt này được gọi là FOR EACH ROW cò súng. Nếu trình kích hoạt được liên kết với bảng được kích hoạt một lần, chúng tôi gọi trình kích hoạt này là FOR EACH STATEMENT kích hoạt.

Kể từ phiên bản 3.9.2, SQLite chỉ hỗ trợ FOR EACH ROW gây nên. Nó chưa hỗ trợ FOR EACH STATEMENT kích hoạt.

Nếu bạn sử dụng một điều kiện trong WHEN mệnh đề, trình kích hoạt chỉ được gọi khi điều kiện là đúng. Trong trường hợp bạn bỏ qua WHEN , trình kích hoạt được thực thi cho tất cả các hàng.

Lưu ý rằng nếu bạn bỏ một bảng, tất cả các trình kích hoạt liên quan cũng bị xóa. Tuy nhiên, nếu trình kích hoạt tham chiếu đến các bảng khác, thì trình kích hoạt sẽ không bị xóa hoặc thay đổi nếu các bảng khác bị xóa hoặc cập nhật.

Ví dụ:một trình kích hoạt tham chiếu đến một bảng có tên people , bạn thả people hoặc đổi tên bảng, bạn cần thay đổi định nghĩa của trình kích hoạt theo cách thủ công.

Bạn có thể truy cập dữ liệu của hàng đang được chèn, xóa hoặc cập nhật bằng cách sử dụng OLDNEW tham chiếu ở dạng:OLD.column_nameNEW.column_name .

OLDNEW tham chiếu có sẵn tùy thuộc vào sự kiện khiến trình kích hoạt được kích hoạt.

Bảng sau minh họa các quy tắc:

Hành động Tham khảo
CHÈN MỚI có sẵn
CẬP NHẬT Cả MỚI và CŨ đều có sẵn
XÓA OLD có sẵn

Ví dụ về trình kích hoạt SQLite

Hãy tạo một bảng mới có tên là khách hàng tiềm năng để lưu trữ tất cả các đầu mối kinh doanh của công ty.

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 ví dụ về trình kích hoạt

Giả sử bạn muốn xác thực địa chỉ email trước khi chèn khách hàng tiềm năng mới vào leads bàn. Trong trường hợp này, bạn có thể sử dụng BEFORE INSERT kích hoạt.

Đầu tiên, tạo BEFORE INSERT kích hoạt như sau:

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)

Chúng tôi đã sử dụng NEW tham chiếu để truy cập cột email của hàng đang được chèn.

Để xác thực email, chúng tôi đã sử dụng LIKE để xác định xem email có hợp lệ hay không dựa trên mẫu email. Nếu email không hợp lệ, RAISE hàm hủy bỏ chèn và đưa ra thông báo lỗi.

Thứ hai, chèn một hàng có email không hợp lệ vào leads bảng.

INSERT INTO leads (first_name,last_name,email,phone)
VALUES('John','Doe','jjj','4089009334');Code language: SQL (Structured Query Language) (sql)

SQLite đã đưa ra lỗi:“Địa chỉ email không hợp lệ” và đã hủy bỏ việc thực thi chèn.

Thứ ba, chèn một hàng có email hợp lệ.

INSERT INTO leads (first_name, last_name, email, phone)
VALUES ('John', 'Doe', '[email protected]', '4089009334');Code language: SQL (Structured Query Language) (sql)

Vì email hợp lệ nên câu lệnh insert được thực thi thành công.

SELECT
	first_name,
	last_name,
	email,
	phone
FROM
	leads;Code language: SQL (Structured Query Language) (sql)

2) SQLite AFTER UPDATE ví dụ về trình kích hoạt

Điện thoại và email của khách hàng tiềm năng quan trọng đến mức bạn không thể để mất thông tin này. Ví dụ:ai đó vô tình cập nhật nhầm email hoặc điện thoại hoặc thậm chí xóa nó.

Để bảo vệ dữ liệu có giá trị này, bạn sử dụng trình kích hoạt để ghi lại tất cả các thay đổi được thực hiện đối với điện thoại và email.

Đầu tiên, tạo một bảng mới có tên lead_logs để lưu trữ dữ liệu lịch sử.

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)

Thứ hai, tạo AFTER UPDATE kích hoạt để ghi dữ liệu vào lead_logs bảng bất cứ khi nào có bản cập nhật trong email hoặc phone cột.

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)

Bạn nhận thấy rằng trong điều kiện trong WHEN mệnh đề chỉ định rằng trình kích hoạt chỉ được gọi khi có sự thay đổi trong cột email hoặc điện thoại.

Thứ ba, cập nhật họ của John từ Doe tới Smith .

UPDATE leads
SET 
   last_name = 'Smith'
WHERE
   id = 1;Code language: SQL (Structured Query Language) (sql)

Trình kích hoạt log_contact_after_update không được gọi vì không có thay đổi trong email hoặc điện thoại.

Thứ tư, cập nhật cả email và điện thoại của John sang những cái mới.

UPDATE leads
SET 
   phone = '4089998888',
   email = '[email protected]'
WHERE
   id = 1;Code language: SQL (Structured Query Language) (sql)

Nếu bạn kiểm tra bảng nhật ký, bạn sẽ thấy có một mục mới ở đó.

SELECT
   old_phone, 
   new_phone, 
   old_email, 
   new_email, 
   user_action
FROM
   lead_logs;Code language: SQL (Structured Query Language) (sql)

Bạn có thể phát triển AFTER INSERTAFTER DELETE kích hoạt để ghi dữ liệu trong lead_logs bảng như một phép tính.

SQLite DROP TRIGGER tuyên bố

Để bỏ một trình kích hoạt hiện có, bạn sử dụng DROP TRIGGER tuyên bố như sau:

DROP TRIGGER [IF EXISTS] trigger_name;Code language: SQL (Structured Query Language) (sql)

Trong cú pháp này:

  • Đầu tiên, chỉ định tên của trình kích hoạt mà bạn muốn đặt sau DROP TRIGGER từ khóa.
  • Thứ hai, sử dụng IF EXISTS chỉ xóa trình kích hoạt nếu nó tồn tại.

Lưu ý rằng nếu bạn bỏ một bảng, SQLite sẽ tự động loại bỏ tất cả các trình kích hoạt được liên kết với bảng.

Ví dụ:để xóa validate_email_before_insert_leads kích hoạt, bạn sử dụng câu lệnh sau:

DROP TRIGGER validate_email_before_insert_leads;Code language: SQL (Structured Query Language) (sql)

Trong hướng dẫn này, chúng tôi đã giới thiệu cho bạn các trình kích hoạt SQLite và chỉ cho bạn cách tạo và loại bỏ trình kích hoạt khỏi cơ sở dữ liệu.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cập nhật ứng dụng và cơ sở dữ liệu Android SQLite

  2. Cách kích hoạt hỗ trợ khóa ngoại trong SQLite

  3. SQLite KHÔNG ĐỦ

  4. Cập nhật với tham số bằng thư viện liên tục của phòng

  5. Bảng xóa nâng cấp Android Sqlite khỏi cơ sở dữ liệu