24/05/2018, 16:43

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.

  • 1. Thực hiện như sau trong QA:
  • 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
        
  • 2. Bây giờ, chúng ta sẽ thử cập nhật cột Fare.
  • 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á.

  • 1.Thực hiện như sau trong QA:
  • CREATE TRIGGER Casc_del 

    ON Flight

    FOR DELETE

    AS

    DELETE Flight_details FROM Flight_details,
    DELETED
        WHERE Flight_details.aircraft_code=DELETED.aircraft_code
        
  • 2.Tạo Delete Trigger khác trên bảng Flight. Trigger này sẽ thực hiện khi trigger Casc_del thực hiện.
  • CREATE TRIGGER del_aircraftcode

    ON Flight_details

    FOR DELETE

    AS

    SELECT * FROM Flight

    SELECT * FROM Flight_Details
  • 3.Thực hiện câu lệnh sau:
  • 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ỷ.

  • 1.Thực hiện như sau bằng QA:
  • 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
  • 2.Thực hiện câu lệnh sau:
  • 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.

    0