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ặcINSTEAD OF
. Bạn có thể tạoBEFORE
vàAFTER
kích hoạt trên bàn. Tuy nhiên, bạn chỉ có thể tạo mộtINSTEAD 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ặ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 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 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', '[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 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 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.