You are on page 1of 23

Bẫy Lỗi

(Triggers)

Nguyễn Trọng Anh


E-Mail: anh@tronganh.com
tronganh@gmail.com
Home: http://www.tronganh.com
Tóm tắt
• Khái niệm về Trigger

• Sử dụng Trigger để ràng buộc trọn vẹn dữ liệu

• Sử dụng Trigger cho tham chiếu toàn vẹn động

• Tạo ra các quy tắc toàn vẹn dữ liệu động

• Sử dụng INSTEAD OF Trigger để tạo nên VIEWs

SQL server 2000 6-2


Tóm tắt

• Những Trigger thông thường

• Kiểm soát Trigger

• Thực hiện Trigger

SQL server 2000 6-3


Khái niệm Trigger
• Trigger là một dạng đặc biệt của thủ tục thường
trú dùng để phản hồi một sự kiện cụ thể.

• Trigger là một đoạn mã được gắn vào bảng dữ


liệu. Chúng được thực hiện khi có một sự kiện
tương ứng với Trigger được gán cho sự kiện đấy

• Trigger không sử dụng hai đặc tính của thủ tục


thường trú là tham số và giá trị trả về.

• Cần cân nhắc trước khi dùng Trigger

SQL server 2000 6-4


Một số ứng dụng thường dùng

Ràng buộc toàn vẹn dữ liệu cho phù hợp với mô


hình quan hệ cơ sở dữ liệu.

Kiểm soát dữ liệu hiện tại khi có thay đổi đến giá
trị trong mẩu tin của bảng.

Kiểm tra dữ liệu nhập vào, phù hợp với mối liên
hệ dữ liệu giữa các bảng với nhau.

Kiểm chứng khi xoá bản ghi trong bảng


SQL server 2000 6-5
Phân loại chính
Dựa vào ứng dụng của Trigger trên một bảng dữ
liệu, Trigger có ba loại như sau:

• INSERT Triggers

• UPDATE Triggers

• DELETE Triggers

• Tập hợp của ba loại trên

SQL server 2000 6-6


Cú pháp
Cú pháp để tạo một Trigger giống như tạo thủ tục
thường trú. Tuy nhiên, Trigger được tạo ra cho
bảng dữ liệu cụ thể.

Create Trigger <Tên Trigger>


On <Tên bảng | Tên Views>
[WITH ENCRYPTION]
{
{ For | After }
< [Delete] [, ] [Insert] [, ] [Update] > | INSTEAD OF
}
AS < Câu lệnh SQL>

SQL server 2000 6-7


Chú ý

ON : chỉ ra rằng Trigger được viết cho bảng hoặc


tên bảng ảo. Trigger với từ khoá AFTER không hỗ
trợ VIEW.

With Encryption:
Giống như trong Thủ tục thường trú hoặc bảng ảo
cho phép ngăn ngừa việc sửa đổi nội dung
Trigger. Sử dụng ALTER Trigger thì with
Encryption không hỗ trợ.

SQL server 2000 6-8


Chú ý
FOR | AFTER
Mệnh đề FOR (AFTER) chỉ ra rằng Trigger sẽ áp
dụng cho hành động nào trong ba hành động
sau: INSERT, DELETE, UPDATE. Mệnh đề có
dạng như sau:
• FOR INSERT

• FOR DELETE

• FOR UPDATE

• FOR INSERT, UPDATE, DELETE

SQL server 2000 6-9


Insert Trigger

Sử dụng mệnh đề FOR INSERT sẽ thực hiện khi


có mẩu tin được thêm vào bảng. Với mỗi bản ghi
được Insert, SQL sẽ tạo ra một bảng sao của bản
ghi và lưu bảng sao của bản ghi này vào trong
bảng mang tên INSERTED.

Bảng này chỉ tồn tại trong quá trình.

SQL server 2000 6-10


DELETE TRIGGER

Giống như Trigger Insert, mỗi khi có bản ghi được


xoá khỏi bảng thì Trigger này thực hiện việc kiểm
tra dữ liệu.

Nếu thoả mãn các điều kiện thì bản ghi này được
xoá khỏi bảng. Nếu không thì bản ghi trả lại giá trị
bình thường, hành động Delete được huỷ bỏ.

SQL server cũng tạo ra một bảng sao các bản ghi
bị xoá đưa vào bảng DELETED.

SQL server 2000 6-11


Update Trigger

Mỗi khi có một bản ghi nào đó được cập nhật, giá
trị của những cột có liên quan trigger sẽ được
kiểm tra trước khi cập nhật

SQL server 2000 6-12


NOT FOR REPLICATION

Nếu thêm câu lệnh này vào trong Trigger, thì


Trigger sẽ không được thực hiện trừ khi có liên
quan đến kỹ thuật sao chép nhân bản

SQL server 2000 6-13


Sử dụng Trigger để ràng buộc
trọn vẹn

Trong trường hợp này Trigger có thể được thực


hiện các chức năng sau:

• Quan hệ 1-1

• Kiểm tra tính duy nhất của lớp loại.

• Kiểm tra dữ liệu khi cần thiết với điều kiện ràng
buộc dữ liệu

SQL server 2000 6-14


Trigger for Insert
Create trigger trgIns
on shippers
for insert
AS
if not exists(Select 'True' From Inserted I where
i.Price > 2)
Begin
raiserror('Khong them ban ghi moi voi Price <
2',16,1)
rollback tran
END
SQL server 2000 6-15
Trigger For Delete
Create Trigger trgDel
on Shippers
For Delete
AS
if not exists(Select 'True' From Deleted I where
i.Price > 2)
Begin
raiserror('Khong Xoa ban ghi moi voi Price <
2',16,1)
rollback tran
END
SQL server 2000 6-16
Trigger for Update
Create Trigger trgUpdate
on Shippers
For update
AS
if not exists(Select 'True' From updated I where
i.Quantity > 2)
Begin
raiserror('Khong Cap Nhat ban ghi moi voi Price
< 2',16,1)
rollback tran
END
SQL server 2000 6-17
Trigger để kiểm tra quy tắc
ràng buộc

Ứng dụng của Trigger thông thường sử dụng để:

• Tham chiếu dữ liệu trong bảng rời rạc

• Kiểm tra sự khác nhau trước và sau khi cập


nhật dữ liệu

• Kiểm tra lỗi

SQL server 2000 6-18


Trigger với giá trị từ bảng khác
CREATE Trigger trgSelect
on TestView
For Insert, Update
AS
if not exists(Select 'True',T.Price From Inserted I,
Shippers T where T.Price > I.Price and I.TEstID =
T.ShipperID)
Begin
raiserror('Kiem tra lai gia tri cua View',16,1)
rollback tran
END
SQL server 2000 6-19
SỬ DỤNG IF UPDATE

Trong Update trigger, chúng ta có thể giới hạn cột


nào được phép cập nhật.
Để thực hiện công việc trên chúng ta sử dụng hai
hàm:

• IF UPDATE

SQL server 2000 6-20


IF UPDATE

Chỉ có hiệu lực trong Trigger.

Sử dụng hàm này với mục đích chia ra những


đoạn mã cho mỗi giá trị cập nhật hoặc chỉ có thể
cho phép với cột được kiểm tra bằng hàm
UPDATE

SQL server 2000 6-21


Trigger for Update có sử dụng hàm
Update()
Create trigger trgUTestView
on TestView
for update
As
IF Update(Price)
Begin
If Exists(Select 'true' from Inserted I, shippers where
I.Price < shippers.ShipperID)
Begin
Raiserror('Khong cap nhat hop le',16,1)
Rollback Tran
End
End

SQL server 2000 6-22


Trigger for Update có sử dụng
hàm Update()

Trigger trên được ứng dụng cho việc Update

Nếu tồn tại Price cập nhật nhỏ hơn ShipperID nhỏ
nhất.

SQL server 2000 6-23

You might also like