Chương 16 Trigger(Hướng dẫn thực hành)
Mục tiêu bài học:
Kết thúc bài này bạn có thể –
Tạo bẫy lỗi INSERT, DELETE, UPDATE, và INSTEAD OF
Mã hóa một đoạn mã bẫy lỗi
Liệt kê các bẫy lỗi được gắn với một bảng.
Xem thông tin về các bẫy lỗi.
Các bước đưa ra trong chương này là chi tiết , dễ hiểu và được xem xét kỹ. Nó được tạo ra với
mục đích giúp người đọc có thể học và hiểu công cụ một cách đầy đủ. Hãy làm theo các bước sau
một cách cẩn thận.
Phần I : Hướng dẫn Thời gian : 1 giờ 30 phút
16.1 Bẫy lỗi
Một bẫy lỗi là một thủ tục lưu đặc biệt, nó được tự động gọi đến bất cứ khi nào dữ liệu
trong bảng bị sửa đổi.Nói cách khác ,bất cứ khi nào các lệnh INSERT, DELETE, hay
UPDATE được sử dụng trên một đối tượng,thì bẫy lỗi tương ứng với câu lệnh đó sẽ được
thực thi.
Trong chương này, chúng ta sẽ tạo một vài kiểu bẫy lỗi khác nhau, và xem thông tin về
các bẫy lỗi.
16.1.1 Tạo bẫy lỗi INSERT
Bẫy lỗi INSERT kiểm tra tính hợp lệ của dữ liệu được nhập vào một bảng. Chúng ta hãy
tạo bẫy lỗi INSERT trong bảng Territories của cơ sở dữ liệu Northwind.Bẫy lỗi này để
kiểm tra chắc chắn rằng các mô tả về territory được nhập vào là không rỗng. Các bước
thực tạo bẫy lỗi đó hiện trong Query Analyzer như sau:
1. Chọn cơ sở dữ liệu Northwind.
2. Thực thi khối lệnh T-SQL sau:
CREATE TRIGGER InsertTerritories
ON Territories
FOR INSERT
AS
IF((SELECT TerritoryDescription FROM INSERTED) = '')
BEGIN
PRINT 'The territory description must be entered'
ROLLBACK TRANSACTION
END
Bẫy lỗi 219
Bây giờ hãy cố gắng chèn thêm một bản ghi vào bảng Territories,với phần miêu tả là
một chuỗi rỗng.
3. Thực thi câu lệnh sau:
INSERT INTO Territories
VALUES (1620, '', 1)
Kết quả được hiển thị trong hình 16.1.
Hình 16.1: Kiểm tra bẫy lỗi INSERT
16.1.2 Tạo bẫy lỗi DELETE
Bẫy lỗi DELETE ngăn không cho xóa các dữ liệu quan trọng từ một bảng.Chúng ta có
thể sử dụng chúng để hạn chế số lượng dữ liệu được xóa từ một bảng tại cùng một thời
điểm.Hãy tạo một bẫy lỗi DELETE,bẫy lỗi này không cho phép xóa nhiều hơn 2 bản ghi
trong cùng một thời gian,từ bảng EmployeeTerritories của cơ sở dữ liệu Northwind.
Các bước thực hiện việc tạo bẫy lỗi đó trong Query Analyzer như sau:
1. Thực thi khối lệnh T-SQL sau:
CREATE TRIGGER DeleteEmployeeTerritories
ON EmployeeTerritories
FOR DELETE
AS
IF (SELECT COUNT (*) FROM DELETED) > 2
BEGIN
PRINT 'You cannot delete more than 2 records'
ROLLBACK TRANSACTION
END
Bây giờ các bẫy lỗi đã được tạo ra, chúng ta hãy thử xóa nhiều hơn 2 bản ghi từ bảng
EmployeeTerritories.
2. Thực thi câu lệnh sau:
220 Thiết kế cơ sở dữ liệu và thực hành với SQL Server
DELETE FROM EmployeeTerritories WHERE EmployeeID = 2
Bảng EmployeeTerritories có hơn 2 bản ghi, thỏa mãn điều kiện được đặt ra. Kết quả
của câu lệnh được hiển thị trong hình 16.2.
Hình 16.2: Sử dụng bẫy lỗi DELETE
16.1.3 Tạo bẫy lỗi Table-Level UPDATE
Một bẫy lỗi table level UPDATE được thực thi khi bất kì một trường nào trong bảng
được cập nhật.
Chúng ta tạo một bẫy lỗi UPDATE để chắc chắn rằng có tồn tại trường UnitsOnOrder
và trường ReorderLevel trong bảng Products, và 2 trường đó sẽ không có giá trị thay
đổi nào nhỏ hơn 10. Bẫy lỗi có thể thực thi mỗi khi thao tác cập nhật được thực hiện trên
bất kì một cột/ trường nào trong bảng Products. Các bước thực hiện trong Query
Analyzer như sau:
1. Thực thi khối lệnh T-SQL:
CREATE TRIGGER CheckProductUpdate
ON Products
FOR UPDATE AS
IF ((SELECT UnitsOnOrder FROM INSERTED) < 10)
OR ((SELECT ReorderLevel FROM INSERTED) < 10)
BEGIN
PRINT 'Error!'
ROLLBACK TRANSACTION
END
Bây giờ chúng ta hãy thực hiện việc cập nhật trên cột UnitsOnOrder.
2. Thực thi câu lệnh sau:
UPDATE Products
SET UnitsOnOrder = 5 WHERE ProductID = 5
Bẫy lỗi 221
Kết quả được hiển thị trong hình 16.3.
Hình 16.3: Sử dụng bẫy lỗi Table-level UPDATE .
16.1.4 Tạo một bẫy lỗi Column-Level UPDATE
Bẫy lỗi column level UPDATE được thực thi khi dữ liệu trong các cột đặc biệt được cập
nhật.
Chúng ta hãy tạo một bẫy lỗi,bẫy lỗi này không cho phép bất kì thay đổi nào tới giá trị
của cột UnitPrice trong bảng Order details. Các bước để tạo bẫy lỗi đó trong Query
Analyzer như sau:
1. Thực thi khối lệnh T-SQL sau:
CREATE TRIGGER OrderDetailsUpdate
ON [Order Details]
FOR UPDATE
AS
IF UPDATE(UnitPrice)
BEGIN
PRINT ‘You cannot update the unit price field’
ROLLBACK TRANSACTION
END
Bây giờ bẫy lỗi OrderDetailsUpdate đã được tạo, chúng ta hãy thử thực hiện thao tác
cập nhật trên cột UnitPrice.
2. Thực thi câu lệnh:
UPDATE [Order Details]
SET UnitPrice = 15
WHERE OrderID = 10248 AND ProductID = 42
Kết quả thực thi được hiện thị trên hình 16.4.
222 Thiết kế cơ sở dữ liệu và thực hành với SQL Server
Hình 16.4: Sử dụng bẫy lỗi Column-level UPDATE
16.1.5 Tạo một bẫy lỗi với tùy chọn WITH Encryption.
Sự mã hóa là một phương pháp lưu giữ các thông tin mật. Sự mã hóa tạo ra các thông tin
không đọc được. Mã hóa bẫy lỗi để chắc chắn rằng các đoạn mã bẫy lỗi là ẩn đối với
người sử dụng.
Chúng ta hãy sử dụng lệnh ALTER TRIGGER của T-SQL để sửa đổi bẫy lỗi INSERT
có tên là InsertTerritories ,đã được chúng ta tạo từ ban đầu. Các bước để mã hóa bẫy lỗi
đó trong Query Analyzer như sau:
1. Thực thi khối lệnh T-SQL sau:
ALTER TRIGGER InsertTerritories
ON Territories WITH ENCRYPTION
FOR INSERT
AS
IF((SELECT TerritoryDescription FROM INSERTED) = '')
BEGIN
PRINT 'The territory description must be entered'
ROLLBACK TRANSACTION
END
Bây giờ, Chúng ta hãy thử xem mã của bẫy lỗi đó, có thể sử dụng thủ tục lưu hệ thống
sp_helptext để xem mã của bẫy lỗi.
2. Thực thi câu lệnh sau:
sp_helptext InsertTerritories
Kết quả được hiển thị trong hình 16.5.
Bẫy lỗi 223