Trigger trong SQL

Trigger

1    Giới thiệu:

Trigger là một hoặc một tập các câu lệnh SQL được lưu trữ trong CSDL và sẽ được kích hoạt bởi sự kiện mà nó theo dõi trên bảng dữ liệu. Sự kiện đó gắn liền với thao tác INSERT, UPDATE hay DELETE. Đôi khi người ta xem trigger là một dạng đặc biệt của thủ tục thường trú nếu xét về mặt mã lệnh viết trong thân trigger.
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 thường đượ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 hay DELETE xảy ra.
– Trigger cũng được dùng để thay thế các constrain trong trường hợp ta muốn kiểm tra ràng buộc dữ liệu kèm theo cá câu thông báo thích hợp theo ý muốn người dùng.

2    Ưu nhược điểm của trigger:

A-  Ưu điểm:

– Dễ dàng kiểm tra tính toàn vẹn của csdl.
– Trigger có thể bắt lỗi logic nghiệp vụ (business logic) ở mức csdl.
– Có thể dùng trigger là một cách khác để thay thế việc thực hiện những công việc hẹn theo giờ theo lịch.
-Trigger rất hiệu quả khi được sử dụng để kiểm soát những thay đổi của dữ liệu trong bảng.

B-   Nhược điểm:

– Trigger chỉ là một phần mở rộng của việc kiểm tra tính hợp lệ của dữ liệu chứ không thay thế được hoàn toàn công việc này.
– Trigger hoạt động ngầm ở trong csdl, không hiển thị ở tầng giao diện. Do đó, khó chỉ ra được điều gì xảy ra ở tầng csdl.
– Trigger thực hiện các update lên bảng dữ liệu vì thế nó làm gia tăng lượng công việc lên csdl và làm cho hệ thống chạy chậm.

 

3    Mở rộng ràng buộc toàn vẹn dữ liệu với các trigger:

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), sửa (update) và 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ó 2 cách để kiểm tra: 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: công việc này chính là công việc lập trình trên các màn hình giao diện.
– Kiểm tra mức cơ sở dữ liệu: công việc này thực hiện bởi các đối tượng constraint hoặc trigger.
Đối với các ràng buộc toàn vẹn dữ liệu đơn giả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.

Đối với các ràng buộc roà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 cột 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 vào.
Một trigger gắn với duy nhất một đối tượng table hoặc một đối tượng view.

4    Các dạng ràng buộc toàn vẹn dữ liệu nên dùng 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 table.
Đặ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 table.
– 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 table 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 table.

5    Cú pháp tạo trigger:

Cú pháp để tạo một trigger cơ bản như sau:

 

Khi thực hiện một Trigger thì SQL tự động tạo ra 2 bảng Inserted và Deleted trong     bộ nhớ chính và cục bộ cho mỗi Trigger, có nghĩa là khi áp dụng Trigger trên bảng nào thì bảng Inserted và Deleted sẽ được sử dụng riêng cho đó bảng đó.

A-  Về các tham số { FOR | AFTER | INSTEAD OF }

Cấu trúc 2 bảng Inserted và Deleted được tạo ra sẽ giống hệt cấu trúc của bảng mà Trigger đang thực thi và chúng chỉ tồn tại trong thời gian Trigger đó thực thi mà thôi.

 

Trigger insert

Trigger insert

 

 

Ví dụ trên: 2 bảng Inserted và Deleted có cấu trúc giống với bảng CTHD  (Bảng mà Trigger đang thực thi) gồm các cột: SoHD, MaSP, SL
Inserted là bảng chứa các dòng dữ liệu vừa được Insert hay Update vào bảng mà Trigger đang thực thi.
Deleted là bảng  chứa các dòng dữ liệu mới được xóa khỏi bảng bằng thao tác Delete hay Update.
* Khi thực hiện thao tác Update, thì đồng nghĩa với việc sẽ xóa những dòng dữ liệu cũ và thêm những dòng dữ liệu mới, khi đó tác Update sẽ vừa đồng thời thêm dữ liệu là các dòng mới vào 2 bảng Inserted và Deleted.

              a-   FOR | AFTER

 

 

Trigger for-after

Trigger for-after

Đối với tham số For | After thì Trigger sẽ được gọi sau khi có thao tác Insert hoặc Update.
Thứ tự thực hiện là từ Database rồi đến bảng Inserted/Deleted
+ Khi đó dữ liệu vừa mới Insert/Update vào sẽ nằm trong cả 2 bảng: bảng chính trong Database và bảng Inserted.
+ Khi thực hiện xóa  một dòng dữ liệu thì dòng dữ liệu trên Database sẽ bị xóa, sau đó dòng bị xóa sẽ được thêm vào bảng Deleted.

             b-   INSTEAD OF

Trigger instead-of

Trigger instead-of

Khi sử dụng tham số Instead of thì Trigger sẽ bỏ qua việc tác động tới CSDL, thay vào đó nó thực hiện việc lưu dữ liệu vào bảng Inserted khi có thao tác Insert, lưu dữ liệu vào bảng Deleted đối với thao tác Delete.

Vì vậy, khi một dòng dữ liệu được thêm vào nó chỉ chứa trong bảng Inserted, và khi xóa một dòng dữ liệu thì nó đồng thời chứa trong bảng Deleted và vẫn còn tồn tại trong Database.
Trigger Instead of thường được dùng để cập nhật khung nhìn (View).

– SQL Statement: Nội dung Trigger bao gồm các câu lệnh dùng để thực thi Trigger
Sau đây chúng ta sẽ lấy ví dụ minh họa việc sử dụng Trigger trong SQL

 

B-   Cú pháp:

Cú pháp lệnh bên trong tương tự SP.
Trong trigger, mã lệnh có thể truy cập các cột của bản ghi hiện tại:
OLD.columnname trả lại nội dung của bản ghi trước khi bị thay đổi hoặc xóa (UPDATE, DELETE).
-NEW.columnname trả lại nội dung của bản ghi mới hoặc bản ghi thay thế (INSERT, UPDATE).

6    Quản lý Trigger:

-Trigger được lưu trữ dưới dạng tập tin văn bản đơn giản trong thư mục cơ sở dữ liệu như sau:  /data_folder/database_name/table_name.trg,
-Để hiển thị các trigger gắn với 1 bảng dữ liệu:

-Một số lệnh quản trị trigger:

 

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">