GIỚI THIỆU Trigger là một loại stored procedure đặc biệt được thực thi một cách tự động khi có câu lệnh UPDATE, INSERT, DELETE tác động vào table Trigger là một công cụ mạnh, khi dữ
Trang 1Bài 13
TRIGGERS
Trang 2I GIỚI THIỆU
Trigger là một loại stored procedure đặc biệt được
thực thi một cách tự động khi có câu lệnh UPDATE, INSERT, DELETE tác động vào table
Trigger là một công cụ mạnh, khi dữ liệu bị sửa đổi,
nó sẽ tự động thực hiện việc ép buộc các giao dịch sửa đổi này thực hiện theo quy tắc đã định nhằm đảm bảo tính toàn vẹn dữ liệu
Các trigger thực thi sau khi các câu lệnh bên trong nó
hoàn tất, nếu có lổi thì trigger sẽ không thực thi
Trigger tự động thực thi, không gọi trigger thi hành
một cách trực tiếp
Trang 3I GIỚI THIỆU
2. LOẠI TRIGGERS: Có 2 loại :
• AFTER triggers hoặc for trigger : thực thi sau khi
thực hiện insert/ delete các dòng trong table, gọi là reactive, chỉ tạo trên table Khi tạo trigger nếu
không chỉ định rõ thì mặc định là AFTER Trigger,
• INSTEAD OF triggers: kiểm tra trứơc khi thực
hiện Insert/Delete, gọi là proactive, tạo trên table và view
Table1 có trigger1, table2 có trigger2, nếu thao tác trên table1 có liên quan đến table2 thì trigger2 tự động thực thi, gọi là trigger lồng (Nested Trigger)
Trang 4I GIỚI THIỆUFor/After Instead of
- Chỉ áp dụng cho table - áp dụng cho table, view
- Có thể định nghĩa nhiều
trigger trên một hành động
I/U/ D
- Chỉ định nghĩa một Trigger trên một hành động I/U/D
Thực thi sau khi :
+ xử lý ràng buộc + thực hiện xong hành động I/U/D phát sinh trigger
- Thi hành trước khi:
+ Xử lý ràng buộc + Thay thế hành động phát sinh trigger
- Không xây dựng được trên table có áp dụng cascade
delete/ update
Trang 5I GIỚI THIỆU
• Ràng buộc toàn vẹn dữ liệu
• Kiểm soát dữ liệu khi có sự thay đổi giá trị trong
bảng
• Xử lý dữ liệu trên nhiều dòng
• Tạo thông báo lổi
• Phát sinh giá trị tính toán
3 ĐẶC ĐIỂM và HẠN CHẾ:
• Không ngăn ngừa thay đổi cấu trúc mà nó chỉ kiểm
tra sự thay đổi hay xoá dữ liệu trong các table có quan hệ với nhau
Trang 6I GIỚI THIỆU
• Kiểm tra constraint trước, sau đó đến trigger
• Không dùng quá nhiều trigger trong một bảng
• Không tạo trigger trên đối tượng Temporary
• Có thể xử lý dữ liệu trên nhiều dòng
• Trong trigger không có các lệnh:create, drop, alter
table, alter database, truncate table, select into
Trang 7II TẠO TRIGGER
1 T ẠO TRIGGER
Sử dụng công cụ Interprise Manager
− Click phải trên tên của Table
− Chọn All Tasks Manage Trigger
Tạo bằng lệnh T-SQL:
− Cú pháp:
CREATE TRIGGER trigger_name
ON table|View [WITH ENCRYPTION]
{ FOR | AFTER| INSTEAD OF } { [INSERT] [,] [UPDATE] [,] [DELETE] } [WITH APPEND] [NOT FOR REPLICATION]
AS sql_statement [ n ]
Trang 8II TẠO TRIGGER
Thông tin về trigger được lưu trong table sysObjects
và syscommands
sp_helptext Trigger_Namesp_helptrigger Table_Namesp_depends Table_Name
Ví dụ 1:
Create trigger trAddAuthor
On Authors For Insert, update
As raiserror(“%d row have been
modified”,0,1,@@rowcount)Return
Trang 9II TẠO TRIGGER
Trigger trAddAuthor sẽ khởi động khi người sử dụng
cập nhật hoặc chèn dữ liệu vào bảng Author
Ví dụ:
Insert authors
(‘555-66-7777’,’Frog’,’Kermit’,’8000-444-5656’,’123 Sesame Street’,’West EastBrooke’, ’CA’,
’90221’, 0)
Trang 10II TẠO TRIGGER
VD2: Create table SANPHAM
(masp int not null, tensp nvarchar(30) not null, mancc nvarchar(5), dvtinh nvarchar(10), soluong int, dongia int )
CREATE TRIGGER chenSP
ON SANPHAM FOR INSERT
Trang 11II TẠO TRIGGER
2. Trigger tự động thực thi khi gặp 3 biến cố:
• Insert Trigger: Mệnh đề For Insert thực thi khi có
một record được thêm vào bảng, SQL tạo ra bảng INSERTED lưu record được chèn, bảng này tồn tại trong quá trình trigger thực thi
• Delete Trigger: Trigger thực thi khi có record bị
xoá, SQL tạo ra bảng DELETED để lưu record bị xoá
• Update Trigger: Khi có record được cập nhật, giá
trị của các cột có liên quan đến trigger sẽ được kiểm tra trứơc khi cập nhật, mẫu tin đựơc cập nhật
sẽ được lưu vào bảng INSERTED (mẫu tin mới được cập nhật) và bảng DELETED (mẫu tin cũ)
Trang 12III AFTER TRIGGERS
a) Insert Trigger :
Ví dụ 1: CREATE TRIGGER Trg_NgayLap_NgayGiaoHD
ON Hoadon AFTER INSERT
Trang 13III AFTER TRIGGERS
Trang 14II AFTER TRIGGERS
b) Delete Trigger: C ó 3 phương thức thực hiện tham
chiếu toàn vẹn khi sử dụng Delete Trigger
The Cascade method
The Restrict method
The Nullify method
V í dụ: tạo một trigger xoá một record trong bảng hoá
đơn
Trang 15II AFTER TRIGGERS
CREATE TRIGGER Trg_Xoa_HD
ON Hoadon AFTER DELETE
AS
SET NOCOUNT ON
IF EXISTS (SELECT * FROM Deleted)
BEGIN
DELETE CT_HOADON WHERE CT_HOADON.MaHD
IN (SELECT hd.MaHD FROM HoaDon hd
INNER JOIN Deleted d ON hd.MaHD=d.Mahd)
RAISERROR('Cac chi tiet HD da bi xoa',10,1)
END
SET NOCOUNT ON
Trang 16
-III AFTER TRIGGERS
Trang 17II TẠO VÀ HIỆU CHỈNH TRIGGER
Trang 18III AFTER TRIGGERS
Trang 19III AFTER TRIGGERS
Trang 20III AFTER TRIGGERS
Print ‘Ngay lap hoa don phai nho hon hoac
bang ngay hien hanh’
RollBack Transaction END
Trang 21IV INSTEAD OF TRIGGERS
INSTEAD of Trigger: chỉ có ở SQL Server 2000, thi hành
thay cho các câu lệnh Insert, Delete, Update do đó khi tạo trigger kiểu này ta phải viết lại các câu lệnh Insert, Delete, Update đối với dữ liệu, có thể áp dụng cho
table và view, trừ các view có WITH CHECK
OPTION
1. INSTEAD OF INSERT Trigger: giống như AFTER
trigger, INSTEAD of INSERT Trigger làm việc với
bảng Inserted Khi thực thi câu lệnh INSERT
Nếu record không vi phạm các ràng buộc thì nó được chèn vào bảng Inserted, không chèn vào bảng cơ sở
Trigger kích hoạt và thực thi những hành động cần
thiết
Trang 22IV INSTEAD OF TRIGGERS
VD: CREATE TRIGGER InsOrdDet ON [Order Details]
INSTEAD OF INSERT
AS
DECLARE @qty int
SELECT @qty=quantity FROM Inserted
IF @qty<= (SELECT UnitsInStock FROM Products P JOIN Inserted I ON P.ProductID = I.ProductID)
INSERT INTO [Order Details]
SELECT * FROM Inserted
ELSE
RAISERROR(‘Not enough products in stock’, 16, 1)
Trang 23IV INSTEAD OF TRIGGERS
2. INSTEAD OF DELETE Trigger:
Khi thực thi câu lệnh DELETE
• Nếu record không vi phạm các Constraint, thì nó
chỉ được Insert vào bảng Deleted
• Trigger kích hoạt và thực thi những hành động cần
thiết
2. INSTEAD OF UPDATE Trigger: làm việc với bảng
Inserted and Deleted lưu trữ giá trị trứơc và sau update Không update dữ liệu trong bảng cơ sở
Trang 24IV INSTEAD OF TRIGGERS
Khi thực thi câu lệnh Update
Nếu record không vi phạm các ràng buộc, thì record cũ được inserted vào bảng Deleted, record mới được
insert vào bảng Inserted
Trigger kích hoạt và thực thi các hành động cần thiết
Lưu ý: INSTEAD OF UPDATE trigger không được định
nghĩa trên table có tuỳ chọn ON UPDATE
CASCADE trong ràng buộc FOREIGN KEY
Trang 25IV INSTEAD OF TRIGGERS
Đối với view: INSTEAD OF triggers có ích với views vì
chúng có thể nâng cao khả năng cập nhật của view
VD:
CREATE VIEW [Alphabetical list of products]
AS
SELECT Products.*, Categories.CategoryName
FROM Categories INNER JOIN Products
ON Categories.CategoryID = Products.CategoryID
WHERE Products.Discontinued=0
Trang 26IV INSTEAD OF TRIGGERS
CREATE TRIGGER InsLP ON [Alphabetical list of products] INSTEAD OF INSERT AS
IF EXISTS(SELECT * FROM Inserted I JOIN Category C
ON I.CategoryID=C.CategoryID) INSERT INTO Products(ProductID, ProductName,
SupplierID, CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel,
Discontinued) SELECT ProductID, ProductName, SupplierID,
CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock,
UnitsOnOrder, ReorderLevel, Discontinued
FROM Inserted
Trang 27IV INSTEAD OF TRIGGERS
ELSE
BEGIN
BEGIN TRANSACTION
INSERT INTO Category(CategoryName)
SELECT CategoryName FROM Inserted
INSERT INTO Products(ProductID,ProductName,
SupplierID, CategoryID, QuantityPerUnit, UnitPrice,
UnitsInStock, UnitsOnOrder,ReorderLevel, Discontinued) SELECT ProductID, ProductName, SupplierID,
@@IDENTITY, QuantityPerUnit, UnitPrice,
UnitsInStock, UnitsOnOrder, ReorderLevel,Discontinued FROM Inserted
COMMIT TRANSACTION END
Trang 28V ALTER TRIGGERS
1. Trong một số trường hợp trigger trở thành gánh nặng,
ví dụ ta muốn import 100 record mới vào bảng thì tốt nhất là nên vô hiệu hoá các trigger
Câu lệnh ALTER TABLE cho phép bạn enable và
disable trigger:
ALTER TABLE table_name
{ ENABLE | DISABLE } TRIGGER{ ALL | trigger_name [ , n ] }
Trang 29V ALTER TRIGGERS
Ví dụ:
ALTER TABLE [Order Details]
DISABLE TRIGGER ALL
Xoá trigger:
DROP TRIGGER Trigger_Name
Trang 30V Nested Trigger
1 Trigger lồng :
• Thao tác của một trigger kéo theo việc thi hành một
trigger khác , các trigger này đựơc gọi là trigger lồng nhau.
• Có thể lồng tối đa 32 cấp
• Các trigger được xem như một đơn vị thi hành
transaction Do vậy, một trigger trong dãy trigger lồng nhau bị lỗi, thi SQL Server sẽ rollback tất cả các action đã thực hiện bởi các trigger.
Trang 31V Nested Trigger
Sửa data
trên table 1
Sửa data trên table 2 Trigger1
Trigger2
gọi
2 Trigger gọi chính nó (recursive trigger ) :
Để tạo trigger dạng này phải bật option của database:sp_dboption database_name, ‘rescusive triggers’, True
Trang 32Sửa data trên table 2
Trang 33I C ác ví dụ tổng hợp
vd1
CREATE TRIGGER ThemxoaCTHD ON [Order
Details] FOR INSERT, UPDATE
Trang 34I C ác ví dụ tổng hợp
vd2
CREATE TRIGGER Trg_NgayLap_NgayGiaoHD
ON Orders AFTER INSERT
Trang 35kiem tra
set IDENTITY_INSERT orders on
insert orders(orderid,customerid,employeeid,orderdate,requireddate) values
(10178,'tomsp',3,'1/1/2005','12/3/2004')
Trang 41I C ác ví dụ tổng hợp
CAU 2
tao bang hoadon_luu LUU Y TAO THU TU CAC
FIELD GIONG BANG HOADON
CREATE TABLE HOADON_LUU (MAHD INT
PRIMARY KEY,MAKH CHAR(5),MANV
INT,NGAYLAPHD DATETIME,NGAYGIAO DATETIME,LOAIHD
VARCHAR(10),NOICHUYEN NVARCHAR(15)) SELECT * FROM HOADON_LUU
Trang 43I C ác ví dụ tổng hợpBEGIN
RAISERROR(60000,16,1,'MAKH','HOADON','MA KH','HOADON')
ROLLBACK END
ELSE
INSERT HOADON_LUU SELECT * FROM INSERTED
Trang 44I C ác ví dụ tổng hợp
KIEM CHUNG
INSERT INTO
HOADON(MAHD,MAKH,MANV,LOAIHD,NOIC HUYEN) VALUES (145,'TOMSP',1,'1','TPHCM') SELECT * FROM HOADON
SELECT * FROM HOADON_LUU