15/23/2008 Khoa CNTT - H qun tr c s d liu1111BÀI 9.TRIGGERHiểu ñược trigger là gì, công dụng của nóTạo trigger.Xoá triggerThay ñổi triggerKhoa CNTT - Hệ quản trị cơ sở dữ liệu22225/23/2008Nội dung bài học1. Giới thiệu Triggers2. ðịnh nghĩa Triggers3. Triggers làm việc như thế nào4. Các ví dụ Triggers5. Các lưu ý
2Khoa CNTT - Hệ quản trị cơ sở dữ liệu33335/23/2008Trigger là gìTrigger là một stored procedure ñặc biệt ñược gọi tự ñộng khiuser 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êntable (insert, update, hoặc delete) thì trigger của thao táctươ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 ñượcxem là một single transaction, có thể ñược roll back từ bất kỳchổ nào trong triggerKhoa CNTT - Hệ quản trị cơ sở dữ liệu44445/23/2008Sử 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ủamột hàng ñộng nào ñó. Bảo trì các dữ liệu không ñược chuẩn hoá
3Khoa CNTT - Hệ quản trị cơ sở dữ liệu55555/23/2008Triggers hoạt ñộng như thế nào? (1)Triggers ñược thực hiện tự ñộng sau khi lệnhINSERT, UPDATE, hoặc DELETE ñược thực hiệntrên một table mà trigger ñó ñược ñịnh nghĩa. Còncác constraints và INSTEAD OF trigger sẽ ñượckiểm tra trước khi lệnh INSERT, UPDATE, hoặcDELETE thực hiện.Constraints sẽ ñược kiểm tra trước trigger.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.Khoa CNTT - Hệ quản trị cơ sở dữ liệu66665/23/2008Triggers hoạt ñộng như thế nào? (2)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 TriggersTable Owners không thể tạo ra các Triggers trênViews hoặc Temporary Tables nhưng có thể thamchiếu ñến view và temporary.
4Khoa CNTT - Hệ quản trị cơ sở dữ liệu77775/23/2008Triggers hoạt ñộng như thế nào ? (3)Triggers không 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ộttrigger có thể ảnh hưởng lên nhiều dòng dữ liệuTa có thể chọn: Xử lý tất cả các dòng cùng với nhau trong trường hợpcá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.Khoa CNTT - Hệ quản trị cơ sở dữ liệu88885/23/2008Logic tables Khi có action Insert, table logic inserted sinhra, có cấu trúc giống với cấu trúc table ñượcinsert, có dữ liệu là record ñang ñược insert Khi có action delete, table deleted sinh ra, cócấu trúc giống với cấu trúc table bị deleted, códữ liệu là record ñang bị xoá Khi có action update, có 2 table inserted vàdeleted
5Khoa CNTT - Hệ quản trị cơ sở dữ liệu99995/23/2008Tạo triggerCREATE TRIGGER trigger_nameON { 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 ] } }Khoa CNTT - Hệ quản trị cơ sở dữ liệu101010105/23/2008Tham 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ểntra constrain và cascade sẽ ñược kiểm tra hoàn thành trước khi trigger thựchiệ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 cho phép cập nhật dữ liệu trên view có WITH CHECK OPTION.
6Khoa CNTT - Hệ quản trị cơ sở dữ liệu111111115/23/2008Tham 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êntable 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.Table deleted và inserted là logical tables. Chúng có cấutrúc giống với table mà trigger ñược ñịnh nghĩa, chứa cácdòng giá trị cũ hoặc mới mà có thể thay ñổi bởi action củauser. Ta có truy xuất dữ liệu trong 2 table này trong ñịnhnghĩa trigger.Khoa CNTT - Hệ quản trị cơ sở dữ liệu121212125/23/2008Tham số (3)Các giá trị kiểu text, ntext, hoặc image trong table insertedvà deleted không truy xuất ñược. Khi trigger ở mức 65, giá trị null sẽ ñược trả về cột có kiểutext, ntext, hoặc image trong table inserted hoặc deletednếu cột cho phép null; chuỗi zero-length ñược trả về nếu cộtcó thể null. IF UPDATE (column): kim tra action update trên ctñưc ch ñnh, không dùng cho action delete. With Append: Chèn thêm trigger này vào các trigger ñã cótrước ñó
7Khoa CNTT - Hệ quản trị cơ sở dữ liệu131313135/23/2008Ví dụUse NorthwindGOCREATE TRIGGER Empl_Delete ON EmployeesFOR DELETEASIF (SELECT COUNT(*) FROM Deleted) > 1BEGINRAISERROR('You cannot delete more than one employee at a time.',16, 1)ROLLBACK TRANSACTIONENDKhoa CNTT - Hệ quản trị cơ sở dữ liệu141414145/23/2008Những lệnh sau ñây KHÔNG ðƯỢC dùng trong ñịnh nghĩa trigger
8Khoa CNTT - Hệ quản trị cơ sở dữ liệu151515155/23/2008Ví 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) GOKhoa CNTT - Hệ quản trị cơ sở dữ liệu161616165/23/2008Alter triggerALTER TRIGGER trigger_name ON table[WITH ENCRYPTION]{{FOR {[,] [DELETE] [,] [UPDATE] [,][INSERT]}ASsql_statement [ .n] }| {FOR {[,] [INSERT] [,] [UPDATE]}ASIF UPDATE (column)[{AND | OR} UPDATE (column) [, .n]]sql_statement [ .n] }}
9Khoa CNTT - Hệ quản trị cơ sở dữ liệu171717175/23/2008Xoá triggerDROP TRIGGER trigger_nameKhoa CNTT - Hệ quản trị cơ sở dữ liệu181818185/23/2008Bà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ậttư ñó trong table VATTUTạo trigger ñể không cho phép một hoá ñơn cónhiều hơn 4 chi tiết hoá ñơnTạo trigger không cho phép hai vật tư trùng tênTạo trigger ñể không cho phép xoá cùng lúc nhiềuhơn một khách hàng
10Khoa CNTT - Hệ quản trị cơ sở dữ liệu191919195/23/2008 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ậttư ñó. Tạo trigger ñể kiểm tra số lượng bán ra củamột vật tư phải nhỏ hơn số lượng tồn trongkhoKhoa CNTT - Hệ quản trị cơ sở dữ liệu202020205/23/2008create trigger t1on chitiethoadon1for insertasdeclare @sl int, @mavt varchar(10)select @sl = sl, @mavt = mavt from insertedupdate vattu1 set slt=slt- @sl where mavt =@mavt
. H qun tr c s d liu1111BÀI 9 .TRIGGER Hiểu ñược trigger là gì, công dụng của nóTạo trigger. Xoá trigger Thay ñổi triggerKhoa CNTT - Hệ quản trị cơ. thiệu Triggers2. ðịnh nghĩa Triggers3. Triggers làm việc như thế nào4. Các ví dụ Triggers5. Các lưu ý
2Khoa CNTT - Hệ quản trị cơ sở dữ liệu33335/23/2008Trigger