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 TRIGGERtừ 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,AFTERhoặcINSTEAD OF. Bạn có thể tạoBEFOREvàAFTERkích hoạt trên bàn. Tuy nhiên, bạn chỉ có thể tạo mộtINSTEAD OFkí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,UPDATEhoặcDELETE. - 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 ENDkhố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 OLD và NEW tham chiếu ở dạng:OLD.column_name và NEW.column_name .
OLD và NEW 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', 'john.doe@sqlitetutorial.net', '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 = 'john.smith@sqlitetutorial.net'
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 INSERT và AFTER 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 TRIGGERtừ khóa. - Thứ hai, sử dụng
IF EXISTSchỉ 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.