16/04/2015
Khái niệm Trigger (trên View,
Table)
Trigger là một dạng thủ tục đặc biệt (không có
tham số), sẽ tự động thực thi khi thực hiện các lệnh
thay đổi dữ liệu (INSERT, UPDATE hay DELETE)
trong CSDL
(Trên SQL Server)
2
1
Khái niệm Trigger
Lệnh tạo Trigger (T-SQL)
Dùng Trigger:
Để thay đổi dữ liệu trên nhiều table có liên quan
Giúp mở rộng khả năng kiểm tra các ràng buộc toàn vẹn
….
Các loại Trigger: UPDATE Trigger, INSERT
Trigger, DELETE Trigger
3
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH <dml_trigger_option> [ ,...n ] ]
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
AS
{ sql_statement [ ; ] [ ,...n ]}
4
1
16/04/2015
Tên Trggier cần tạo
CREATE TRIGGER trigger_name
ON { table | view }
CREATE TRIGGER trigger_name
ON { table | view }
{ FOR | AFTER | INSTEAD OF }
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
….
AS
{ sql_statement }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
….
AS
{ sql_statement }
5
Tạo trigger trên Table
hay view nào?
6
CREATE TRIGGER trigger_name
ON { table | view }
CREATE TRIGGER trigger_name
ON { table | view }
{ FOR | AFTER | INSTEAD OF }
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
….
AS
{ sql_statement }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
….
Kiểu trigger cần tạo
AS
{ sql_statement }
Hành động nào sẽ kích hoạt trigger
7
8
2
16/04/2015
Các kiểu Trigger
CREATE TRIGGER trigger_name
ON { table | view }
AFTER trigger:
Chạy sau các hành động kiểm tra dữ liệu (rule, constraint):
Thực hiện sau khi hành động INSERT, UPDATE hay
DELETE đã được thực hiện (FOR)
Chỉ định nghĩa được AFTER trigger trên Table
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
….
AS
{ sql_statement }
INSTEAD OF trigger
Các lệnh trong nội dung của
trggier
9
Cơ chế hoạt động của INSERT
Trigger
Thay thế cho hành động kích hoạt trigger (do vậy sẽ chạy
trước các hành động kiểm tra dữ liệu (rule, constraint)
Có thể định nghĩa được trên một view (với một hoặc nhiều
table cơ sở)
10
Không dùng được trên View có WITH CHECK OPTION
Cơ chế hoạt động của INSERT
Trigger (AFTER/FOR)
Khi thực hiện việc thêm dòng mới vào table
sẽ kích hoạt một trigger (INSERT Trigger), dữ
liệu của dòng mới cũng được lưu trữ vào Table
(trong RAM) có tên là INSERTED
Table INSERTED có cấu trúc giống hoàn toàn
với Table gắn trigger
Nội dung của
2 Table tạm
Chứa các dòng
mới được thêm
vào
11
12
3
16/04/2015
Cơ chế hoạt động của DELETE
Trigger
Cơ chế hoạt động của DELETE
Trigger
Khi DELETE dòng từ table sẽ kích hoạt
một trigger (DELETE Trigger), dữ liệu của
dòng vừa bị xóa sẽ được lưu vào Table (trong
RAM) có tên là DELETED
Table DELETED có cấu trúc giống hoàn toàn
với Table gắn trigger
Nội dung của
2 Table tạm
Chứa các dòng bị
xóa từ Table R
13
Cơ chế hoạt động của UPDATE
Trigger
Khi UPDATE nội dung một dòng từ table sẽ
kích hoạt trigger (UPDATE Trigger)
Sử dụng cả 2 table trung gian DELETED (lưu
nội dung dòng trước khi cập nhật) và
INSERTED (lưu nội dung dòng sau khi cập
nhật)
15
14
Cơ chế hoạt động của UPDATE
Trigger
UPDATE
16
4
16/04/2015
Ví dụ: Xét CSDL QLBH (trong
bài tập)
Hàm UPDATE()
Tạo Trigger trên table CTHD cho hành động Insert,
kiểm tra RBTV: một hoá đơn (cùng một SOHD) chỉ có
tối đa 10 mục hàng
CREATE TRIGGER tr_cthd_insert ON cthd FOR insert
AS
IF EXISTS(SELECT cthd.sohd
FROM inserted INNER JOIN cthd ON cthd.SOHD=inserted.sohd
GROUP BY cthd.sohd HAVING COUNT(*)>10)
BEGIN
RAISERROR (N'Mỗi hóa đơn không thể có trên 10 dòng',16,1)
ROLLBACK TRAN
END
Sử dụng hàm UPDATE(column_name)
Kiểm tra cột nào được thay đổi dữ liệu
Cú pháp:
UPDATE(column)
Hàm UPDATE() không dùng trong DELETE
trigger
17
Hàm UPDATE()
18
Ví dụ:
Tạo Trigger trên table CTHD cho hành động UPDATE, kiểm
tra RBTV: một hoá đơn (cùng một SOHD) chỉ có tối đa 10
mục hàng
Cấu trúc thường dùng:
CREATE TRIGGER trigger_name
ON
table_name
……
AS
IF UPDATE(column_name) [{AND|OR}
UPDATE(column_name)…]
sql_statements
CREATE TRIGGER trg02_CTHD
ON CTHD AFTER INSERT
AS
IF UPDATE(SOHD)
IF EXISTS (SELECT * FROM INSERTED WHERE (SELECT COUNT(*)
FROM CTHD WHERE CTHD.SOHD=INSERTED.SOHD)>10)
BEGIN
RAISERROR (N'Một hóa đơn không thể có nhiều hơn 10 mặt hàng',16,1)
ROLLBACK TRAN
END
19
20
5
16/04/2015
Ví dụ về INSTEAD OF trigger
Ví dụ về INSTEAD OF trigger
CREATE TRIGGER trg_CTHD ON CTHD
INSTEAD OF INSERT
AS
PRINT N‘các dòng mới được thêm vào table INSERTED
PRINT N‘Không có dòng mới nào được thêm vào CTHD
CREATE TRIGGER trg_CTHD ON INSERT
INSTEAD OF INSERT
AS
INSERT INTO CTHD
(SOHD,MAMH,SOLGBAN,DONGIABAN)
SELECT SOHD,MAMH,SOLGBAN,DONGIABAN
FROM INSERTED
PRINT ‘Dữ liệu mới đã được thêm vào table CTHD
21
22
Sửa đổi Trigger sử dụng giao
diện
Lệnh Sửa đổi nội dung Trigger
ALTER TRIGGER trigger_name
ON { table | view }
[ WITH <dml_trigger_option> [ ,...n ] ]
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
AS
{ sql_statement [ ; ] [ ,...n ]}
Right Click
23
24
6
16/04/2015
Lệnh xóa một Trigger
Xóa Trigger sử dụng giao diện
DROP TRIGGER <tên trigger>
Ví dụ:
USE Vidu
GO
DROP TRIGGER trg01_CTHD
GO
Right Click
25
26
Vô hiệu hóa Trigger
Làm cho các trigger đang tồn tại nhưng không hoạt
động.
Cú pháp:
ALTER TABLE table_name DISABLE TRIGGER
ALL | trigger_name
Table_name: Tên của table có gắn các trigger
ALL: Tất cả các trigger trên table_name sẽ bị vô hiệu
hóa
trigger_name: Chỉ trigger có tên chỉ ra mới bị vô hiệu
hóa
27
Vô hiệu hóa Trigger
Ví dụ:
- Vô hiệu hóa tất cả các trigger trên table CTPN
trong CSDL hiện hành
ALTER TABLE CTPN DISABLE TRIGGER ALL
- Chỉ vô hiệu hóa trigger có tên trg_CTPN trên table
CTPN trong CSDL hiện hành
ALTER TABLE CTPN DISABLE
TRIGGER trg_CTPN
28
7
16/04/2015
Cho phép các Trigger hoạt động
lại (sau khi đã bị vô hiệu hóa)
Cú pháp:
ALTER TABLE table_name ENABLE TRIGGER
ALL | trigger_name
Trong đó:
Table_name: Tên của table có gắn các trigger
ALL: Tất cả các trigger trên table_name sẽ có hiệu
lực trở lại
trigger_name: Chỉ trigger có tên chỉ ra mới có hiệu
lực trở lại
29
Vô hiệu hóa/cho phép hoạt động động
của Trigger (sử dụng giao diện)
30
31
8