SQLite - Trình kích hoạt
SQLite Triggerslà các hàm gọi lại cơ sở dữ liệu, được tự động thực hiện / gọi khi một sự kiện cơ sở dữ liệu cụ thể xảy ra. Sau đây là những điểm quan trọng về trình kích hoạt SQLite:
Trình kích hoạt SQLite có thể được chỉ định để kích hoạt bất cứ khi nào XÓA, CHÈN hoặc CẬP NHẬT của một bảng cơ sở dữ liệu cụ thể xảy ra hoặc bất cứ khi nào CẬP NHẬT xảy ra trên một hoặc nhiều cột được chỉ định của bảng.
Tại thời điểm này, SQLite chỉ hỗ trợ trình kích hoạt CHO MỖI ROW, không hỗ trợ trình kích hoạt CHO MỖI THỐNG KÊ. Do đó, chỉ định rõ ràng CHO TỪNG ROW là tùy chọn.
Cả mệnh đề WHEN và các hành động kích hoạt đều có thể truy cập các phần tử của hàng đang được chèn, xóa hoặc cập nhật bằng cách sử dụng các tham chiếu của biểu mẫu NEW.column-name và OLD.column-name, trong đó tên-cột là tên của một cột từ bảng mà trình kích hoạt được liên kết với.
Nếu mệnh đề WHEN được cung cấp, các câu lệnh SQL được chỉ định chỉ được thực thi cho các hàng mà mệnh đề WHEN là đúng. Nếu không cung cấp mệnh đề WHEN, câu lệnh SQL được thực thi cho tất cả các hàng.
Từ khóa BEFORE hoặc AFTER xác định khi nào các hành động kích hoạt sẽ được thực hiện liên quan đến việc chèn, sửa đổi hoặc loại bỏ hàng được liên kết.
Các trình kích hoạt sẽ tự động bị loại bỏ khi bảng liên kết với chúng bị loại bỏ.
Bảng được sửa đổi phải tồn tại trong cùng cơ sở dữ liệu với bảng hoặc dạng xem mà trình kích hoạt được đính kèm và người ta phải sử dụng tablename không phải database.tablename.
Một hàm SQL đặc biệt RAISE () có thể được sử dụng trong một chương trình kích hoạt để đưa ra một ngoại lệ.
Cú pháp
Sau đây là cú pháp cơ bản để tạo trigger.
CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name
ON table_name
BEGIN
-- Trigger logic goes here....
END;
Đây, event_namecó thể là INSERT, DELETE và UPDATE cơ sở dữ liệu hoạt động trên bảng được đề cậptable_name. Bạn có thể tùy chọn chỉ định CHO TỪNG ROW sau tên bảng.
Sau đây là cú pháp để tạo trình kích hoạt trên thao tác CẬP NHẬT trên một hoặc nhiều cột được chỉ định của bảng.
CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name
ON table_name
BEGIN
-- Trigger logic goes here....
END;
Thí dụ
Chúng ta hãy xem xét một trường hợp mà chúng ta muốn tiếp tục kiểm tra thử cho mọi bản ghi đang được chèn vào bảng COMPANY, mà chúng ta tạo mới như sau (Thả bảng COMPANY nếu bạn đã có).
sqlite> CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
Để tiếp tục thử nghiệm kiểm toán, chúng tôi sẽ tạo một bảng mới có tên AUDIT nơi các thông báo nhật ký sẽ được chèn vào bất cứ khi nào có mục nhập trong bảng COMPANY cho một bản ghi mới.
sqlite> CREATE TABLE AUDIT(
EMP_ID INT NOT NULL,
ENTRY_DATE TEXT NOT NULL
);
Ở đây, ID là ID bản ghi AUDIT và EMP_ID là ID sẽ đến từ bảng COMPANY và DATE sẽ giữ dấu thời gian khi bản ghi sẽ được tạo trong bảng COMPANY. Bây giờ hãy tạo một trình kích hoạt trên bảng COMPANY như sau:
sqlite> CREATE TRIGGER audit_log AFTER INSERT
ON COMPANY
BEGIN
INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, datetime('now'));
END;
Bây giờ, chúng ta sẽ bắt đầu công việc thực tế, Hãy bắt đầu chèn bản ghi vào bảng COMPANY, điều này sẽ dẫn đến việc tạo bản ghi nhật ký kiểm toán trong bảng AUDIT. Tạo một bản ghi trong bảng COMPANY như sau:
sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );
Thao tác này sẽ tạo một bản ghi trong bảng COMPANY, như sau:
ID NAME AGE ADDRESS SALARY
---------- ---------- ---------- ---------- ----------
1 Paul 32 California 20000.0
Đồng thời, một bản ghi sẽ được tạo trong bảng AUDIT. Bản ghi này là kết quả của một trình kích hoạt, mà chúng tôi đã tạo trên thao tác INSERT trong bảng COMPANY. Tương tự, bạn có thể tạo trình kích hoạt của mình trên các thao tác CẬP NHẬT và XÓA dựa trên yêu cầu của bạn.
EMP_ID ENTRY_DATE
---------- -------------------
1 2013-04-05 06:26:00
Trình kích hoạt danh sách
Bạn có thể liệt kê tất cả các trình kích hoạt từ sqlite_master bảng như sau -
sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger';
Câu lệnh SQLite ở trên sẽ chỉ liệt kê một mục nhập như sau:
name
----------
audit_log
Nếu bạn muốn liệt kê các trình kích hoạt trên một bảng cụ thể, thì hãy sử dụng mệnh đề AND với tên bảng như sau:
sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger' AND tbl_name = 'COMPANY';
Câu lệnh SQLite ở trên cũng sẽ chỉ liệt kê một mục nhập như sau:
name
----------
audit_log
Giảm kích hoạt
Sau đây là lệnh DROP, có thể được sử dụng để thả một trình kích hoạt hiện có.
sqlite> DROP TRIGGER trigger_name;