Tìm hiểu Trigger trong SQLite
Trong bài học hôm nay mình sẽ giới thiệu một khái niệm khá quen thuộc trong SQLite đó trigger. Vậy trigger trong SQLite là gì? Nó được sử dụng trong SQLite như thế nào. Chúng ta cùng tìm hiểu trong nội dung tiếp theo.
1. Trigger trong SQLite là gì?
Trigger
trong SQLite
là các hàm callback, mà tự động được thực hiện/gọi (performed/invoked) khi một sự kiện trong cơ sở dữ liệu xuất hiện. Sau đây là một số điểm quan trọng về Trigger trong SQLite
:
Trigger
trongSQLite
có thể được chỉ định để trigger bất cứ khi nào xảy raDELETE
,INSERT
hoặcUPDATE
của một bảng cơ sở dữ liệu cụ thể hoặc bất cứ khi nàoUPDATE
xảy ra trên một hoặc nhiều cột trong một bảng.- Tại thời điểm này,
SQLite
chỉ hỗ trợ triggerFOR EACH ROW
chứ không hỗ trợ triggerFOR EACH STATEMENT
. Do đó, việc chỉ định rõ ràngFOR EACH ROW
là tùy chọn. - Cả mệnh đề
WHERE
và các hành động trigger đều có thể truy cập các phần tử của hàng đượ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 mẫuNEW.column-name
vàOLD.column-name
, trong đócolumn-name
là tên của một cột trong bảng mà trigger được liên kết đến. - Nếu mệnh đề
WHERE
được cung cấp, các câu lệnhSQLite
được chỉ định chỉ được thực thi cho các hàng mà mệnh đềWHERE
là đúng. Nếu không có mệnh đềWHERE
được cung cấp, các câu lệnhSQLite
được thực thi cho tất cả các hàng. - Từ khóa
BEFORE
hoặcAFTER
xác định khi nào các hành động trigger sẽ được thực thi liên quan đến việc chèn, sửa đổi hoặc xóa hàng. - Các trigger được tự động xóa khi bảng mà chúng được liên kết bị xóa.
- Bảng được sửa đổi phải tồn tại trong cùng một cơ sở dữ liệu với bảng hoặc view mà trigger được gắn kết và chỉ sử dụng
tablename
chứ không phảidatabase.tablename
. - Một hàm đặc biệt trong
SQLite
đó là hàmRAISE()
có thể được sử dụng bên trong một Trigger để tạo một ngoại lệ.
2. Cú pháp của trigger trong SQLite
Sau đây là cú pháp cơ bản của việc tạo ra một trigger.
CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name ON table_name BEGIN -- Trigger logic goes here.... END;
Ở đây, event_name
có thể là hoạt động cơ sở dữ liệu INSERT
, DELETE
, và UPDATE
trên bảng table_name
được đề cập. Bạn có thể tùy ý chỉ định FOR EACH ROW
sau table name.
Bài viết này được đăng tại [free tuts .net]
Sau đây là cú pháp để tạo một trigger trên một hoạt động UPDATE
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;
3. Ví dụ của trigger trong SQLite
Giả sử chúng ta đã có bảng COMPANY
có cấu trúc định nghĩa bảng như sau:
sqlite> CREATE TABLE COMPANY( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL );
Và bảng AUDIT
có cấu trúc định nghĩa bảng như sau:
sqlite> CREATE TABLE AUDIT( EMP_ID INT NOT NULL, ENTRY_DATE TEXT NOT NULL );
Bây giờ chúng ta sẽ tạo một trigger 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 hãy bắt đầu chèn một bản ghi vào bảng COMPANY
, điều này sẽ tạo ra một bản ghi trong bảng AUDIT
. Câu lệnh để 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 );
Điều 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 trigger, mà chúng ta đã tạo trên hoạt động INSERT
trong bảng COMPANY
. Tương tự, chúng ta có thể tạo các trigger của mình trên các hoạt động UPDATE
và DELETE
tùy theo yêu cầu của mình.
EMP_ID ENTRY_DATE ---------- ------------------- 1 2013-04-05 06:26:00
4. Liệt kê các Trigger trong SQLite
Bạn có thể liệt kê tất cả các trigger từ bảng sqlite_master
như sau:
sqlite> SELECT name FROM sqlite_master WHERE type = 'trigger';
Câu lệnh SQLite
ở trên sẽ liệt kê chỉ một trigger như sau:
name ---------- audit_log
Nếu bạn muốn liệt kê các kích hoạt trên một bảng cụ thể, thì hãy sử dụng toán tử 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ẽ liệt kê chỉ một trigger như sau:
name ---------- audit_log
5. Lệnh xóa trigger trong SQLite
Sau đây là lệnh DROP
, có thể được sử dụng để xóa trigger hiện có.
sqlite> DROP TRIGGER trigger_name;