Các Đặc Trưng Và Hạn Chế Của Trigger


Chương 5

QUẢN LÝ TRIGGER


5.1. Giới thiệu

5.1.1. Khái niệm

Trigger có thể xem là một dạng đặc biệt của thủ tục lưu trữ, bởi vì bên trong nội dung của trigger lưu trữ các câu lệnh dùng để thực hiện một số hành động nào đó mà người lập trình sẽ chỉ ra. Tuy nhiên, khác với thủ tục lưu trữ, trigger hoàn toàn không có tham số và giá trị trả về. Ngoài ra, chúng ta không thể gọi thực hiện trực tiếp trigger bằng lệnh EXECUTE như thủ tục lưu trữ hoặc bằng bất kỳ một lệnh nào khác mà Trigger được thực thi một cách tự động khi có sự thay đổi dữ liệu (do tác động của câu lệnh INSERT, UPDATE, DELETE) trên một bảng nào đó. Chính nhờ vào tính năng đặc biệt là tự động thực hiện mà nội dung các lệnh bên trong trigger được dùng cho các công việc sau:

- Kiểm tra các ràng buộc toàn vẹn dữ liệu phức tạp.

- Thực hiện các xử lý được thiết kế thi hành tại server (trong mô hình client/server). Các xử lý mà ta muốn chúng sẽ được tự động thực hiện khi có thao tác INSERT, UPDATE hoặc DELETE xảy ra.

- Trigger cũng được dùng để thay thế các ràng buộc trong trường hợp ta muốn việc kiểm tra ràng buộc dữ liệu kèm theo các câu thông báo thích hợp theo ý muốn người dùng.

5.1.2. Các ứng dụng của Trigger

Khi sử dụng Trigger thì ta cần phải xem xét trường hợp nào và khi nào sử dụng Trigger. Khi xây dựng các ứng dụng cơ sở dữ liệu, Trigger có thể thực hiện được nhiều thứ nhưng chúng cũng có thể gây ra nhiều phiền toái trong lúc thực thi. Chính vì vậy, ta chỉ nên sử dụng Trigger trong trường hợp cần thiết. Nếu sử dụng không đúng không gian và thời gian sẽ khó kiểm soát được những gì do Trigger gây ra. Các ứng dụng nên dùng Trigger:

- Ràng buộc toàn vẹn dữ liệu (Referential Integrity)

- Kiểm soát dữ liệu hiện tại (Audit Trails)

- Kiểm soát dữ liệu nhập (Input Check)

- Kiểm soát khi xóa dữ liệu (Delete Check)

1) Ràng buộc toàn vẹn dữ liệu (Referential Integrity)

Có 3 thao tác cơ bản làm thay đổi dữ liệu trên các bảng của cơ sở dữ liệu đó là thao tác thêm (insert), thao tác sửa (update) và thao tác xóa (delete). Như vậy để đảm bảo dữ liệu nhất quán và đúng đắn, ta cần kiểm tra việc thực hiện của 3 thao tác này.


Các cách kiểm tra ràng buộc dữ liệu: kiểm tra mức giao diện và kiểm tra mức cơ sở dữ liệu.

- Kiểm tra mức giao diện: Việc kiểm tra được thực hiện tại các chức năng trên các màn hình giao diện được viết bằng các ngôn ngữ lập trình.

- Kiểm tra mức cơ sở dữ liệu: Việc kiểm tra được thực hiện bởi các đối tượng Constraint hoặc Trigger.

Trên SQL Server, có 2 cách thực hiện ràng buộc toàn vẹn dữ liệu:

- Ràng buộc toàn vẹn dữ liệu bằng phương pháp mô tả (declarative data integrity). Thực hiện ràng buộc dữ liệu theo phương pháp này chính là các công việc xác định ràng buộc khóa chính, khóa ngoại, kiểm tra miền giá trị, … và mô tả chúng tại thời điểm tạo bảng. Đặc điểm cần biết của phương pháp này là việc kiểm tra sẽ được thực hiện trước khi cho phép ghi vào bảng.

- Ràng buộc toàn vẹn dữ liệu bằng phương pháp theo thủ tục (procedural data integrity). Trong phương pháp này, việc ràng buộc toàn vẹn dữ liệu được xác định bởi tập hợp các câu lệnh T-SQL. Các câu lệnh chứa bên trong đối tượng Trigger, chúng sẽ được gọi thi hành khi có thao tác thêm, xóa, hoặc sửa dữ liệu xảy ra trên bảng tương ứng. Đặc điểm cần biết của phương pháp này là việc kiểm tra sẽ được thực hiện sau khi dữ liệu được ghi vào bảng.

Do đó, đối với các ràng buộc toàn vẹn dữ liệu đơn giản chẳng hạn như kiểm tra các ràng buộc miền giá trị, kiểm tra các ràng buộc giữa các thuộc tính trên cùng một bảng dữ liệu, … Ta nên sử dụng đối tượng Constraint. Còn đối với các ràng buộc toàn vẹn dữ liệu phức tạp khác - là những quy tắc được định nghĩa dùng để kiểm tra tính toàn vẹn của dữ liệu trên nhiều trường hoặc nhiều dòng của các bảng khác nhau. Khi đó bắt buộc chúng ta phải sử dụng đối tượng Trigger, đối tượng này cho phép chúng ta xây dựng các câu lệnh bên trong nó với mục tiêu là các câu lệnh này sẽ được thực hiện khi các thao tác làm thay đổi dữ liệu xảy ra trên bảng dữ liệu mà nó gắn. Một trigger gắn với duy nhất một đối tượng table hoặc một đối tượng view.

2) Kiểm soát dữ liệu hiện tại (Audit Trails)

Khi cơ sở dữ liệu chưa được chuẩn hóa (Normalization) thì có thể xảy ra dữ liệu thừa, chứa ở nhiều vị trí trong cơ sở dữ liệu thì yêu cầu đặt ra là dữ liệu cần cập nhật thống nhất trong mọi nơi. Trong trường hợp này ta phải sử dụng Trigger.

3) Kiểm soát dữ liệu nhập (Input Check)

Khi có sự thay đổi dữ liệu trên một bảng và chúng ta muốn dữ liệu trên một hay nhiều bảng khác cũng tự động thay đổi theo cho phù hợp.

4) Kiểm soát khi xóa mẩu tin (Delete Check)


Khi xóa một mẩu tin của một bảng mà ta muốn kiểm soát việc xóa mẩu tin này có ảnh hưởng đến các bảng khác hay không.

5.1.3. Các khả năng của Trigger

Một trigger có thể nhận biết, ngăn chặn và huỷ bỏ được những thao tác làm thay đổi trái phép dữ liệu trong cơ sở dữ liệu. Các thao tác trên dữ liệu (xoá, cập nhật và bổ sung) có thể được trigger phát hiện ra và tự động thực hiện một loạt các thao tác khác trên cơ sở dữ liệu nhằm đảm bảo tính hợp lệ của dữ liệu. Thông qua trigger, ta có thể tạo và kiểm tra được những mối quan hệ phức tạp hơn giữa các bảng trong cơ sở dữ liệu mà bản thân các ràng buộc không thể thực hiện được.

5.1.4. Cơ chế hoạt động của Trigger

Khi thực hiện việc thêm mới một bản ghi vào một bảng, thao tác này sẽ kích hoạt một trigger, trigger lưu trữ dữ liệu của bản ghi vừa thêm mới vào một bảng có tên là INSERTED. Tương tự, khi thực hiện việc xóa bản ghi của một bảng, thao tác này sẽ kích hoạt một trigger, trigger lưu trữ dữ liệu của bản ghi vừa xóa vào một bảng có tên là DELETED.

Cấu trúc của bảng INSERTED và DELETED hoàn toàn giống với cấu trúc của bảng dữ liệu liên quan đến trigger khi tạo ra. Các bảng này chỉ được sử dụng với các lệnh trong trigger. Các bảng này thường được sử dụng để khôi phục lại phần dữ liệu đã thay đổi (roll back).

Khi thực hiện việc cập nhật dữ liệu trong Microsoft SQL Server thì được xem như là sự phối hợp của hai lệnh DELETE và INSERT (xóa bỏ dữ liệu cũ và thêm vào dữ liệu mới sau khi sửa đổi). Do đó, đối với các trigger liên quan đến việc sửa đổi dữ liệu thì chúng ta có thể tham chiếu đến cả hai bảng trung gian INSERTED và DELETED.

Dữ liệu trong hai bảng INSERTED và DELETED tuỳ thuộc vào câu lệnh tác động lên bảng làm kích hoạt trigger:

- Khi câu lệnh DELETE được thực thi trên bảng, các dòng dữ liệu bị xoá sẽ được sao chép vào trong bảng DELETED. Bảng INSERTED trong trường hợp này không có dữ liệu.

- Khi câu lệnh INSERT được thực thi trên bảng, dữ liệu trong bảng INSERTED sẽ là dòng dữ liệu được bổ sung vào bảng. Bảng DELETED trong trường hợp này không có dữ liệu.

- Khi câu lệnh UPDATE được thực thi trên bảng, các dòng dữ liệu cũ chịu sự tác động của câu lệnh sẽ được sao chép vào bảng DELETED, còn trong bảng INSERTED sẽ là các dòng sau khi đã được cập nhật.


5.1.5. Các loại Trigger

Có hai loại Trigger là: INSTEAD OF, AFTER (FOR).

Trigger loại INSTEAD OF sẽ bỏ qua hành động kích hoạt trigger (các thao tác insert, delete, update), thay vào đó nó sẽ thực hiện các câu lệnh bên trong trigger. Tuy nó sẽ bỏ qua hành động tác động đến cơ sở dữ liệu nhưng việc lưu trữ dữ liệu vào các bảng INSERTED (đối với thao tác insert), DELETED (đối với thao tác delete) vẫn được thực hiện. Trigger loại INSTEAD OF có thể định nghĩa trên đối tượng table hoặc view. Khi một câu lệnh update tác động đến một bảng chứa trigger loại INSTEAD OF, các câu lệnh T-SQL bên trong trigger sẽ được thi hành, nó đóng vai trò thay thế câu lệnh Update. Đặc tính này cho phép ta chỉ định các câu lệnh xử lý phức tạp trong trigger nhằm làm tăng thêm lệnh thay đổi dữ liệu trên bảng.

Trigger loại AFTER là loại mặc định (cũng chính là loại có từ khóa khai báo FOR), nó có vai trò như là phần bổ sung của hành động kích hoạt trigger. Các câu lệnh bên trong trigger loại này chỉ được thi hành sau khi hành động kích hoạt đã được thực hiện rồi. Các ràng buộc toàn vẹn loại mô tả sẽ được thực hiện trước, rồi các câu lệnh bên trong trigger mới được thực hiện sau. Trigger loại AFTER chỉ được phép định nghĩa trên duy nhất đối tượng bảng mà không thể định nghĩa trên đối tượng view.

Trên một bảng ta có thể định nghĩa cả hai loại trigger. Nếu định nghĩa cả hai loại trigger và các constraint cho một bảng, thì thứ tự thực thi sẽ là trigger INSTEAD OF, các constraint được xử lý và sau cùng là trigger AFTER. Nếu các constraint phát hiện ra có vi phạm tính toàn vẹn dữ liệu thì các hành động của trigger INSTEAD OF sẽ được quay lui, còn các hành động của trigger AFTER không được thi hành. Giống như các thủ tục lưu trữ, trigger có thể được lồng đến 32 cấp và có thể được kích hoạt đệ quy.

5.1.6. Các đặc trưng và hạn chế của Trigger

1) Đặc trưng:

Từ một trigger có thể xây dựng bên trong nó các câu lệnh tác động lên trường của bảng bất kỳ trong cơ sở dữ liệu hoặc bớt các đối tượng bên ngoài cơ sở dữ liệu hiện hành. Có thể áp dụng trigger cho đối tượng View. Một trigger có thể thực hiện nhiều hành động (multiple actions), và nó có thể được kích hoạt bởi nhiều hơn một hành động.

2) Hạn chế:

Trigger không thể được tạo trên một bảng tạm (temporary bảng) hoặc bảng hệ thống (system table). Tuy nhiên, các câu lệnh bên trong trigger hoàn toàn có thể tham chiếu đến nội dung bên trong các bảng tạm và bảng hệ thống. Các trigger loại INSTEAD OF DELETE và INSTEAD OF UPDATE không thể được định nghĩa trên các bảng có chứa khóa ngoại và trên mối quan hệ nối từ bảng chứa nó thông qua khóa


ngoại đến bảng khác đã có thiết đặt tương ứng trên các mỗi quan hệ có tính chất Cascade Delete Related Records và Cascade Update Related Fieds.

5.2. Ngôn ngữ DLL của Trigger

1) Tạo Trigger

Tác dụng: Dùng để tạo một trigger Cú pháp:

CREATE TRIGGER <Trigger_name> ON <Table_Name> | <View_Name>

[WITH[ENCRYPTION]|[EXECUTE AS Clause]]

FOR|AFTER|INSTEAD OF

[INSERT] [,] [UPDATE] [,] [DELETE] [NOT FOR REPLICATION]

AS BEGIN

{sql_statement} END

Trong đó:

- Trigger_name: Là tên của trigger

- Table_Name: Là tên bảng

- View_Name: Là tên View

- ENCRYPTION: Cho phép ngăn ngừa việc sửa đổi nội dung của trigger.

- EXECUTE_AS_Clause: Xác định nội dung bảo mật được thực thi trigger.

- FOR|AFTER|INSTEAD OF: Là các loại trigger.

- INSERT, UPDATE, DELETE: Là các hành động tác động lên bảng hoặc View.

- NOT FOR REPLICATION: Nếu thêm câu lệnh vào trigger thì trigger sẽ không thực hiện trừ khi bảng có liên quan đến kỹ thuật sao chép nhân bản (replication).

Việc tạo trigger bắt đầu với mệnh đề CREATE TRIGGER theo sau là tên của trigger. Trigger không cho phép xác định tên của cơ sở dữ liệu như là tiền tố của tên đối tượng. Do vậy cần chọn cơ sở dữ liệu với mệnh đề USE <Database_Name> và từ khóa GO trước câu lệnh tạo trigger. Cần phải chỉ định từ khóa GO bởi vì câu lệnh CREATE TRIGGER phải là câu lệnh đầu tiên trong một lô câu truy vấn. Mặc định, quyền chủ sở hữu bảng được phép tạo trigger. Còn nếu ta dùng MS để tạo thì chỉ cần chọn đúng cơ sở dữ liệu cần tạo trigger. Khi đó ta không cần phải sử dụng mệnh đề USE <Database_Name>. Trong trường hợp muốn tên trigger là một chuỗi gồm có cả các khoảng trắng, bạn phải đặt chúng trong cặp dấu [ ].

Ví dụ: Tạo Trigger chỉ cho phép xóa một thí sinh trong bảng thí sinh.


Use QLTS GO

CREATE TRIGGER TS_Delete ON Thisinh FOR DELETE

AS

IF (SELECT COUNT(*) FROM Deleted) > 1 BEGIN

RAISERROR(

'Khong the xoa nhieu hon mot thi sinh.', 16, 1) ROLLBACK TRANSACTION

END

2) Thay đổi Trigger

Tác dụng: Dùng để sửa Trigger đã tạo. Cú pháp:

ALTER TRIGGER <Trigger_name> ON <Table_Name> | <View_Name>

[WITH[ENCRYPTION]|[EXECUTE AS Clause]]

FOR|AFTER|INSTEAD OF

[INSERT] [,] [UPDATE] [,] [DELETE] [NOT FOR REPLICATION]

AS BEGIN

{sql_statement} END

Ví dụ: Sửa Trigger TS_Delete cho phép xóa tối đa thí sinh trong bảng thí sinh.

Use QLTS GO

ALTER TRIGGER TS_Delete ON Thisinh FOR DELETE

AS

IF (SELECT COUNT(*) FROM Deleted) > 5 BEGIN

RAISERROR(

'Khong the xoa nhieu hon mot thi sinh.', 16, 1) ROLLBACK TRANSACTION

END


3) Xóa trigger

Tác dụng: Xóa trigger đã tạo Cú pháp:

DROP TRIGGER <Trigger_Name>

Với <Trigger_Name> là tên trigger sẽ bị xóa. Ví dụ: Xóa thủ tục có tên là TS_Delete DROP Trigger TS_Delete

4) Làm trigger mất hiệu lực

Tác dụng: Tạm thời tắt trigger (làm cho nó không còn hiệu lực). Ví dụ, cần tắt bớt đi một số trigger để cô lập vấn đề cần gỡ rối; hoặc cần sửa đổi dữ liệu, chuyển dữ liệu giữa hai cơ sở dữ liệu, …

Cú pháp:

ALTER TABLE <Table_Name>

DISABLE TRIGGER [<Trigger_Name>|ALL]

Ví dụ 1: Ngắt trigger TS_Delete khỏi bảng Thisinh ALTER TABLE Thisinh DISABLE TRIGGER TS_Delete Ví dụ 2: Ngắt tất cả các trigger khỏi bảng Thisinh

ALTER TABLE Thisinh DISABLE TRIGGER ALL

5) Làm trigger có hiệu lực

Tác dụng: Làm cho trigger có hiệu lực trở lại. Cú pháp:

ALTER TABLE <Table_Name>

ENABLE TRIGGER [<Trigger_Name>|ALL]

Ví dụ 1: Làm cho trigger TS_Delete trong bảng Thisinh có hiệu lực ALTER TABLE Thisinh ENABLE TRIGGER TS_Delete

Ví dụ 2: Làm cho tất cả các trigge trong bảng Thisinh có hiệu lực. ALTER TABLE Thisinh ENABLE TRIGGER ALL

5.3. Lập trình với Trigger

5.3.1. Bảng trung gian

Từ cơ chế hoạt động của Trigger ta thấy rằng khi có thao tác Insert, Update hoặc Delete xảy ra trên bảng, các thao tác này sẽ kích hoạt Trigger, hành động sẽ tạo ra một hoặc nhiều bảng trung gian. Các bảng này có thể xem như là các sổ ghi nhận giao tác (transaction logs) của hành động. Hai bảng trung gian đó là Inserted và Deleted.



STT

Hành động

Bảng

INSERTED

Bảng

DELETED

1

Thêm bản ghi (Insert)

Dữ liệu được

thêm vào

Không có dữ liệu

2

Xóa bản ghi (Delete)

Không có dữ liệu

Dữ liệu bị xóa

3

Cập nhật bản ghi (Update)

Dữ liệu được cập

nhật

Dữ liệu trước khi

được cập nhật

Có thể bạn quan tâm!

Xem toàn bộ 323 trang tài liệu này.

Ví dụ 1: Tạo Trigger Trigger_InsertNganh cho bảng Ngành. Khi hành động insert xảy ra trên bảng Nganh, trigger Trigger_InsertNganh được kích hoạt. Câu lệnh SELECT bên trong trigger sẽ hiển thị bản ghi chứa trong bảng Inserted và bảng Deleted.

CREATE TRIGGER Trigger_InsertNganh ON Nganh

AFTER INSERT AS

BEGIN

select * from inserted select * from deleted END

Kết quả kiểm tra hoạt động của trigger Trigger_InsertNganh khi hành động insert được thực thi: Bảng inserted chứa bản ghi vừa được thêm vào và bảng deleted không có dữ liệu.

Hình 5 1 Kết quả thực hiện hành động Insert Ví dụ 2 Tạo Trigger 1

Hình 5.1. Kết quả thực hiện hành động Insert

Ví dụ 2: Tạo Trigger Trigger_DeleteNganh cho bảng Ngành. Khi hành động delete xảy ra trên bảng Nganh, trigger Trigger_DeleteNganh được kích hoạt. Câu lệnh SELECT bên trong trigger sẽ hiển thị bản ghi chứa trong bảng Inserted và bảng Deleted.

CREATE TRIGGER Trigger_DeleteNganh

..... Xem trang tiếp theo?
⇦ Trang trước - Trang tiếp theo ⇨

Ngày đăng: 16/07/2022