Trigger là gì Trigger là một stored procedure đặc biệt được gọi tự động khi user cập nhật dữ liệu trên một table Được kết hợp với table: Được định nghĩa trên một table cụ thể.. Được
Trang 1Sau bài học này, sinh viên có thể:
Hiểu được trigger là gì, công dụng của nó
Tạo trigger
Xoá trigger
Thay đổi trigger
Trang 2Nội dung bài học
1. Giới thiệu Triggers
2. Định nghĩa Triggers
3. Triggers làm việc như thế nào
4. Các ví dụ Triggers
5. Các lưu ý
Trang 3Trigger là gì
Trigger là một stored procedure đặc biệt được gọi tự động khi user cập nhật dữ liệu trên một table
Được kết hợp với table: Được định nghĩa trên một
table cụ thể
Được gọi tự động: Khi có một thao tác cập chật dữ liệu trên table (insert, update, hoặc delete) thì trigger của thao tác tương ứng được tự động thực hiện
Khác với procedure, trigger không thể được gọi trực tiếp, không nhận tham số
Là một phần của transaction: những lệnh trong
trigger được xem là một single transaction, có thể
được roll back từ bất kỳ chổ nào trong trigger
Trang 4Sử dụng trigger để làm gì?
Để thực hiện cascade updates và cascade deletes
qua các table quan hệ trong database
Ép buộc tính toàn vẹn dữ liệu phức tạp : Thực hiện các ràng buộc có tham chiếu đến các column trong nhiều table
Định nghĩa Custom Error Messages: Dùng trigger để trả về các chuỗi thông báo trạng thái của một hàng động nào đó
Bảo trì các dữ liệu không được chuẩn hoá: !
Trang 5Triggers hoạt động như thế nào?
Triggers được thực hiện tự động sau khi lệnh INSERT, UPDATE, hoặc DELETE được thực hiện trên một table mà trigger đó được định nghĩa Còn các constraints và INSTEAD OF trigger sẽ được kiểm tra trước khi lệnh INSERT, UPDATE, hoặc DELETE thực hiện.
Constraints sẽ được kiểm tra trước.
Một table có thể có nhiều Triggers cho một action Một trigger
có thể được định nghĩa cho nhiều action.
Khi có nhiều trigger trong một table, thì table owner có thể dùng procedure hệ thống sp_settriggerorder để chỉ định trigger đầu
và trigger cuối để thực thi Thứ tự của các trigger còn lại không thể sắp xếp được
User phải có quyền để thực hiện tất cả các lệnh mà được định nghĩa trong Triggers
Table Owners không thể tạo ra các Triggers trên Views hoặc Temporary Tables nhưng có thể tham chiếu đến view và
temporary.
Trang 6Triggers hoạt động như thế nào
Triggers không thể trả kết quả về.
Triggers có thể điều khiển multi-row actions: một hành động INSERT, UPDATE, hoặc
DELETE gọi một trigger có thể ảnh hưởng lên nhiều dòng dữ liệu, Ta có thể chọn:
Xử lý tất cả các dòng cùng với nhau trong trường hợp các dòng ảnh hưởng phải thoả điều kiện của trigger
Xử lý từng dòng thỏa điều kiện
Trang 7Tạo trigger
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE] }
[ WITH APPEND ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ] [ n ]
} ]
sql_statement [ n ]
}
}
Trang 8Tham số (1)
Table | view : tên view/table mà tigger được thực
hiện khi có action tương ứng
WITH ENCRYPTION: mã hoá nột dung text của lệnh
create trigger trong table syscomments
AFTER: Trigger sẽ được gọi chỉ khi tất cả các hành động đã thực hiện xong Các kiển tra constrain và cascade sẽ được kiểm tra hoàn thành trước khi
trigger thực hiện Default là AFTER nếu chỉ có từ
khoá FOR được chỉ định AFTER trigger không thể định nghĩa trên view
INSTEAD OF: chỉ định trigger đựoc thực hiện thay cho action của trigger INSTEAD OF triggers không
Trang 9Tham số (2)
{ [DELETE] [,] [INSERT] [,] [UPDATE] } : chỉ định
action gắn với trigger Đối với INSTEAD OF triggers, action DELETE không cho phép trên table mà có
relationship mà chỉ định CASCADE ON DELETE
Tương tự, action UPDATE không cho phép trên table
có relationships mà CASCADE ON UPDATE
có cấu trúc giống với table mà trigger được định
nghĩa Chúng giữ các dòng giá trị cũ hoặc mới mà có thể thay đổi bởi action của user Ta có truy xuất dữ liệu trong 2 table này trong định nghĩa trigger
Trang 10Tham số (3)
Các giá trị kiểu text, ntext, hoặc image trong table
inserted và deleted không truy xuất được
Khi trigger ở mức 65, giá trị null sẽ được trả về cột
có kiểu text, ntext, hoặc image trong table
inserted hoặc deleted nếu cột cho phép null; chuỗi
zero-length được trả về nếu cột có thể null
IF UPDATE (column): kiểm tra action update trên cột được chỉ định, khôgn dùng cho action
delete
Trang 11Ví dụ
Use Northwind
GO
CREATE TRIGGER Empl_Delete ON Employees
FOR DELETE
AS
IF (SELECT COUNT(*) FROM Deleted) > 1
BEGIN
RAISERROR(
'You cannot delete more than one employee at a time.',
16, 1)
ROLLBACK TRANSACTION
END
Trang 12Những lệnh sau đây không được dùng trong định nghĩa trigger
Trang 13Ví dụ (1)
USE pubs
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'reminder' AND type = 'TR') DROP TRIGGER reminder
GO
CREATE TRIGGER reminder ON titles
FOR INSERT, UPDATE
AS
RAISERROR (50009, 16, 10)
GO
Trang 14Alter trigger
ALTER TRIGGER trigger_name ON table
[WITH ENCRYPTION]
{{FOR {[,] [DELETE] [,] [UPDATE] [,][INSERT]}
AS
sql_statement [ n] }
| {FOR {[,] [INSERT] [,] [UPDATE]}
AS
IF UPDATE (column)
[{AND | OR} UPDATE (column) [, n]]
sql_statement [ n] }
Trang 15Xoá trigger
Trang 16Bài tập áp dụng (QLVT)
Tạo trigger để khi insert một record vào trong table CHITIETHOADON, thì cập nhật lại
SLTON của vật tư đó trong table VATTU
Tạo trigger để không cho phép một hoá đơn
có nhiều hơn 4 chi tiết hoá đơn
Tạo trigger không cho phép hai vật tư trùng tên
Tạo trigger để không cho phép xoá cùng lúc
Trang 17 Tạo trigger để không cho phép xoá một vật tư mà đã có ít nhất một chi tiết hoá đơn của vật tư đó.
Tạo trigger để kiểm tra số lượng bán ra của một vật tư phải nhỏ hơn số lượng tồn trong kho
Trang 18create trigger t1
on chitiethoadon1
for insert
as
declare @sl int, @mavt varchar(10)
select @sl = sl, @mavt = mavt from inserted
update vattu1 set slt=slt- @sl where mavt