Quản lý Trigger trong SQL Server

Một phần của tài liệu Phát triển ứng dụng cơ sở dữ liệu với c và net framework (Trang 188 - 192)

L ợi ích của Store Procedure:

3.2.6.Quản lý Trigger trong SQL Server

Trigger là một store procedure đặc biệt được gọi tự động khi user cập nhật dữ liệu trên một table, nghĩa là thay vì được thực thi bởi user, trigger được thực thi bởi server CSDL khi một hoạt động xác định được thực hiện trên bảng.

Trigger được định nghĩa trên một table cụ thể. Khác với procedure, trigger không được gọi trực tiếp, không nhận tham số.

Trigger là một phần của Transaction: những lệnh trong trigger được xem là một single transaction, có thểđược rollback từ bất kỳ chỗ nào trong trigger.

- Để thực hiện cascade updates và cascade deletes qua các table quan hệ

trong database

- Ép buộc tính toàn vẹn dữ liệu phức tạp: thực hiện các ràng buộc có tham chiếu đến các column trong nhiều table

- Định nghĩa Custom Error Message:

Dùng trigger để trả về các chuỗi thông báo trạng thái của một hành động nào

đó.

- Bảo trì các dữ liệu không được chuẩn hóa.

Trigger hoạt động như thế nào?

- Trigger được thực hiện tự động sau khi lệnh INSERT, UPDATE hoặc DELETE được thực hiện trên một table mà trigger đó được định nghĩa. Còn các CONSTRAINT và INSTEAD OF trigger sẽ được kiểm tra trước khi lệnh INSERT, UPDATE hoặc DELETE được thực hiện.

CONSTRAINT sẽđược kiểm tra trước trigger.

- Một table có thể có nhiều trigger cho một hành động, một trigger có thể được định nghĩa cho nhiều hành động.

- Khi có nhiều trigger trong một table thì table owner có thể dùng procedure hệ thống sp_settriggeroder để chỉ định trigger đầu và trigger cuối để thực thi. Thứ

tự của các trigger còn lại không thể sắp xếp được.

User phải có quyền để thực hiện tất cả các lệnh mà được định nghĩa trong trigger.

- Table owners không thể tạo ra các trigger trên View hoặc Temporary tables nhưng có thể tham chiếu đến View và temporary.

- Trigger không trả kết quả về

- Trigger có thể điều khiển multi-row actions: một hành động INSERT, UPDATE hoặc DELETE gọi một trigger có thể ảnh hưởng lên nhiều dòng dữ liệu. Ta có thể chọn xử lý theo 2 cách:

+ Xử lý tất cả các dòng cùng với nhau trong trường hợp các dòng ảnh hưởng phải thỏa điều kiện của trigger.

+ Xử lý từng dòng thỏa điều kiện.

- Khi có hành động insert, table inserted sinh ra, có cấu trúc giống với cấu trúc table được insert, có dữ liệu là record đang được insert.

- Khi có hành động delete, table delete sinh ra, có cấu trúc giống với cấu trúc table bị deleted, có dữ liệu là record đang bị xóa.

- Khi có hành động update, sẽ có 2 table inserted và deleted được sinh ra.

Cú pháp tạo Trigger:

Giải thích:

- Table/View: tên table, view được thực hiện khi có hành động tương ứng. - With Encryption: mã hóa nội dung text của lệnh create trigger trong table syscomments

- After: Trigger được gọi chỉ khi tất cả các hành động đã thực hiện xong. Các kiểm tra constraint và cascade sẽ được kiểm tra hoàn thành trước khi trigger thực hiện.

Default là After nếu chỉ có từ khóa For được chỉ định. After trigger không thểđược định nghĩa trên View.

- Instead of: chỉ định trigger được thực hiện thay cho hành động của trigger. Instead of trigger không cho phép cập nhật dữ liệu trên View có With Check Option. (adsbygoogle = window.adsbygoogle || []).push({});

- Delete, insert, update: chỉ định hành động gắn với trigger. Đối với instead of trigger, Delete không cho phép trên table mà có relationship mà chỉ định Cascade On Delete. Tương tự, hành động Update không cho phép trên trên table mà có relationship Cascade On Update.

- Table deleted và inserted là logical tables. Chúng có cấu trúc giống với table mà trigger được định nghĩa, chứa các dòng giá trị cũ hoặc mới mà có thể thay

đổi bởi hành động của user. Chúng ta có thể truy xuất dữ liệu trong 2 table này trong định nghĩa trigger.

- Các giá trị text, ntext hoặc image trong table inserted và deleted không truy xuất được.

Khi trigger ở mức 65, giá trị null sẽ được trả về cột có kiểu text, ntext hoặc image trong table inserted hoặc deleted nếu cột cho phép null; chuỗi zero-length

được trả về nếu cột có thể null.

- With Apend: chèn thêm trigger này vào các trigger đã có trước đó.

- If update (column): kiểm tra hành động Update trên cột được chỉ định, không dùng cho hành động delete.

Lưu ý:

Các lệnh sau đây không được dùng trong định nghĩa trigger: - Create, Alter, Drop, Load, Restore Database

- Load, Restore Log - Disk Init

- Disk Resize - Reconfigure

Ví dụ:

Trong CSDL QuanLyThuVien, tạo trigger có tên tg_updCuonSach vói nội dung: khi thuộc tính tình trạng trên bảng Cuonsach được cập nhật thì trạng thái của bảng Dausach cũng được cập nhật.

Create trigger [tg_updCuonsach] on [dbo].[Cuonsach]

for update as

declare @isbn varchar(50)

declare my_cursor cursor for select isbn from inserted open my_cursor

fetch next from my_cursor into @isbn while (@@fetch_status = 0)

begin

exec sp_CapnhatTrangthaiDausach @isbn fetch next from my_cursor into @isbn end close my_cursor deallocate my_cursor Sửa đổi cấu trúc, xóa Trigger: Cú pháp để sửa đổi cấu trúc của Trigger như sau: Để xóa Trigger ta dùng cú pháp lệnh: DROP TRIGGER trigger_name

Một phần của tài liệu Phát triển ứng dụng cơ sở dữ liệu với c và net framework (Trang 188 - 192)