Trigger-Phần thực hành
INSERT trigger đảm bảo dữ liệu nhập vào bảng được đúng đắn. Xem xét ví dụ: Tạo INSERT trigger để đảm bảo không có vé nào được đặt vào một ngày trong quá khứ. Các bước thực hiện: 1. Mở QA, chọn ...
INSERT trigger đảm bảo dữ liệu nhập vào bảng được đúng đắn.
Xem xét ví dụ:
Tạo INSERT trigger để đảm bảo không có vé nào được đặt vào một ngày trong quá khứ.
Các bước thực hiện:
1. Mở QA, chọn cơ sở dữ liệu FI.
2. Thực hiện đoạn lệnh sau trong QA.
CREATE TRIGGER insert_trigg
ON Reservation
FOR INSERT
AS
IF((Select journey_date From Inserted)<getdate())
BEGIN
PRINT 'journey_date khong the nho hon ngay hien tai'
ROLLBACK TRAN
END
3. Sau đó, hãy thử thực hiện thêm một bản ghi có journey_date < ngày hiện tại của hệ thống.
DELETE trigger ngăn cản việc xoá đi những dữ liệu quan trọng trong bảng.
Xem xét ví dụ sau:
Tạo trigger để tránh xoá 2 bản ghi trong bảng Passenger đồng thời.
1. Trong QA thực hiện như sau:
CREATE TRIGGER delete_trigg ON Passenger FOR Delete AS IF((Select count(*) From deleted)>2) BEGIN PRINT 'Ban khong duoc xoa cung luc 2 ban ghi' ROLLBACK TRAN END
2. Thực hiện câu lệnh xoá nhiều hơn 2 bản ghi từ bảng Passenger, giả sử như sau:
Kết quả:
Tạo Table Level UPDATE Trigger.
Trigger UPDATE sẽ được thực hiện bất cứ khi nào dữ liệu trong bảng được cập nhật.
Xem xét ví dụ:
Tạo UPDATE trigger đảm bảo rằng cột No_of_seats trong bảng Reservation không được cập nhật giá trị lớn hơn 5 và journey_date không nhỏ hơn ngày hiện tại.
1. Thực hiện như sau trong QA.
CREATE TRIGGER CheckingUpdate ON Reservation FOR UPDATE AS IF((Select no_of_seats From inserted)>5) OR ((Select journey_date From Inserted)<getdate()) BEGIN PRINT 'Error' ROLLBACK TRAN END
2. Thực hiện truy vấn sau để kiểm tra Trigger:
UPDATE Reservation
SET no_of_seats=6 Where PNR_no=3
Kết quả:
Tạo Column Level Update Trigger
Loại Trigger được thực hiện khi dữ liệu trong cột nào đó được cập nhật.
CREATE TRIGGER Col_Update_trig ON Flight_details FOR UPDATE AS IF UPDATE(Fare) BEGIN PRINT 'Ban khong the update cot Fare' ROLLBACK TRAN END
Encryption (mã hoá) là phương pháp giữ bí mật cho Trigger. Nội dung của Trigger sau khi được mã hoá sẽ không đọc được.
1. Thực hiện câu lệnh ALTER TRIGGER để sửa insert_trigg:
ALTER TRIGGER insert_trigg
ON Reservation
WITH ENCRYPTION
FOR INSERT
AS
IF((Select journey_date From Inserted)<getdate())
BEGIN
PRINT 'journey_date khong the nho hon ngay hien tai'
ROLLBACK TRAN
END
2. Thực hiện câu lệnh sau:
Sử dụng thủ tục hệ thông sp_helptrigger để hiển thị danh sách các trigger trong cơ sở dữ liệu hiện tại.
sp_helptrigger Flight_Details
Kết quả:
Xem xét ví dụ sau:
Tạo Trigger để kiểm tra dữ liệu nhập vào cột Meal Pref của bảng Passenger phải là dữ liệu đã tồn tại trong cột Meal codes của bảng Meal.
1. Thực hiện như sau trong QA:
CREATE TRIGGER ins_trig ON Passenger FOR INSERT AS IF (Select [Meal Pref]FROM INSERTED) NOT IN (Select meal_code FROM Meal) BEGIN Print 'Ban khong the insert gia tri nay' ROLLBACK TRAN END
2. Bạn hãy thử kiểm tra hoạt động của Trigger trên.
Trong Nested trigger, một trigger có thể được thực hiện lồng trong trigger khác. Chúng ta có thể lồng trigger tối đa 32 mức. Nested trigger cho phép cascade update và cascade delete.
Thực hiện câu lệnh để kích hoạt Nested trigger:
sp_configure ‘nested trigger’, 1
Ngược lại:
sp_configure ‘nested trigger’, 0
Tạo Cascade delete trigger để thực hiện công việc sau: Nếu xoá một chuyến bay trong bảng Flight, thì tất cả các thông tin liên quan trong bảng Flight_Details sẽ bị xoá.
CREATE TRIGGER Casc_del
ON Flight
FOR DELETE
AS
DELETE Flight_details FROM Flight_details,
DELETED WHERE Flight_details.aircraft_code=DELETED.aircraft_code
CREATE TRIGGER del_aircraftcode
ON Flight_details
FOR DELETE
AS
SELECT * FROM Flight
SELECT * FROM Flight_Details
DELETE FROM Flight
WHERE aircraft_code= ‘9W01’
Chúng ta có thể thực hiện INSTEAD OF trigger trên bảng, nó thay thế cho câu lệnh INSERT, UPDATE, DELETE nguyên thuỷ.
CREATE TRIGGER instead_trigg
ON Service
INSTEAD OF INSERT
AS
BEGIN
Select Service_code AS 'Inserted columns' From Inserted
Select Service_code AS 'Deleted columns' From Deleted
Select Service_code AS 'Table contents' From Service
END
INSERT INTO Service
Values(‘FA’, ‘First Aid’)
Kết quả:
Thực hiện những yêu cầu sau bằng QA:
Tạo INSERT trigger có tên ins_chkclass trên bảng Reservation. Trigger đảm bảo rằng dữ liệu được nhập vàp trường class code tồn tại trong bảng Class_master và số ghế được đặt không quá 2.
Tạo Cascading UPDATE trigger có tên upd_mealcode trong bảng Meal. Khi meal code trong bảng Meal được cập nhật thì những dữ liệu liên quan trong bảng Airline_meal cũng được cập nhật tương ứng.
Hiển thị mã lệnh (code) của trigger ins_chkclass trên bảng Reservation.
Sửa trigger upd_mealcode để người sử dụng không nhìn thấy mã lệnh của nó.
Tạo View có tên all_day chứa thông tin chi tiết sau: day code, day name, và aircraft code trong bảng Day_master và Flight_days. Tạo DELETE trigger tên là del_day để xoá dữ liệu trong View. Kiểm tra lại sự thực hiện của trigger.