SQL Server: Trigger INSTEAD OF

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Trigger INSTEAD OF được thực thi thay thế cho các hoạt động INSERT, UPDATE hoặc DELETE. Các trigger INSTEAD OF có thể được tạo ra trên các bảng (TABLE) cũng như khung nhìn (VIEW). Mỗi bảng hay khung nhìn chỉ có thể có một trigger INSTEAD OF được định nghĩa cho mỗi hoạt động INSERT, UPDATE và DELETE.

Các trigger INSTEAD OF được thực thi trước khi các lần kiểm tra ràng buộc được thực hiện trên bảng. Những trigger này được thực thi sau khi tạo ra các bảng Inserted và Deleted. Các trigger INSTEAD OF tăng sự đa dạng của các loại cập nhật mà người dùng có thể thực hiện đối với khung nhìn. Hình sau thể hiện ví dụ về hoạt động của trigger INSTEAD OF.

SQL: Trigger Instead of
Hoạt động của trigger INSTEAD OF

Trong ví dụ được trình bày trong hình trên, trigger INSTEAD OF DELETE trên bảng Account_Types được tạo ra. Nếu có bất kỳ bản ghi nào trong bảng Account_Types bị xóa thì những bản ghi tương ứng trong bảng Customer_Details cũng sẽ được gỡ bỏ. Do đó, thay vì làm việc chỉ trên một bảng, thì ở đây trigger đảm bảo rằng hoạt động xóa được thực hiện trên cả hai bảng.

Lưu ý: Người dùng không thể tạo các trigger INSTEAD OF cho các hoạt động xóa hoặc cập nhật trên các bảng có các tùy chọn tầng ON DELETE và tầng ON UPDATE đã chọn.

Sau đây là cú pháp cho việc tạo ra trigger INSTEAD OF:

CREATE TRIGGER <trigger_name>
ON { <table_name> | <view_name> }
{ INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
AS <sql_statement>

, trong đó:
view_name: chỉ ra khung nhìn mà trên đó trigger DML được tạo ra.

INSTEAD OF: chỉ ra rằng trigger DML thực thi thay cho các hoạt động sửa đổi. Những trigger không được định nghĩa trên các khung nhìn có thể cập nhật sử dụng WITH CHECK OPTION.

Đoạn mã sau đây tạo ra trigger INSTEAD OF DELETE trên bảng Account_Transactions. Nếu có bất kỳ bản ghi nào trong bảng này bị xóa, thì những bản ghi tương ứng trong bảng EmployeeDetails cũng sẽ được gỡ bỏ.

CREATE TRIGGER Delete_AccType
ON Account_Transactions
INSTEAD OF DELETE
AS
BEGIN
DELETE FROM EmployeeDetails WHERE EmployeeID IN
(SELECT TransactionTypeID FROM deleted)
DELETE FROM Account_Transactions WHERE TransactionTypeID IN
(SELECT TransactionTypeID FROM deleted)
END

Sử dụng trigger INSTEAD OF với các khung nhìn

Các trigger INSTEAD OF có thể được chỉ ra trên các bảng cũng như khung nhìn. Trigger được thực thi thay vì hành động kích hoạt ban đầu. Các trigger INSTEAD OF cung cấp phạm vi rộng hơn và các loại cập nhật mà người dùng có thể thực hiện đối với khung nhìn. Mỗi bảng hoặc khung nhìn được giới hạn chỉ cho một trigger INSTEAD OF cho mỗi hành động kích hoạt (INSERT, UPDATE hoặc DELETE).

Người dùng không thể tạo ra một trigger INSTEAD OF trên các khung nhìn có mệnh đề WITH CHECK OPTION đã định nghĩa.

Hình dưới đây hiển thị ví dụ về việc sử dụng các trigger INSTEAD OF với các khung nhìn.

Đoạn mã sau tạo ra một bảng có tên là Employee_Personal_Details.

CREATE TABLE Employee_Personal_Details (
EmpID int NOT NULL,
FirstName varchar(30) NOT NULL,
LastName varchar(30) NOT NULL,
Address varchar(30)
)

Đoạn mã sau tạo ra một bảng có tên là Employee_Salary_Details.

CREATE TABLE Employee_Salary_Details (
EmpID int NOT NULL,
Designation varchar(30),
Salary int NOT NULL
)

Đoạn mã dưới đây tạo ra một khung nhìn Employee_Details_View sử dụng các cột từ hai bảng trên bằng cách nối hai bảng theo cột chung EmpID.

CREATE VIEW Employee_Details_View
AS
SELECT e1.EmpID, FirstName, LastName, Designation, Salary
FROM Employee_Personal_Details e1
JOIN Employee_Salary_Details e2
ON e1.EmpID = e2.EmpID

Đoạn mã sau tạo ra trigger INSTEAD OF DELETE có tên Delete_Employees trên khung nhìn Employee_Details_View ở trên. Khi một hàng được xóa khỏi khung nhìn thì trigger sẽ được kích hoạt, và nó sẽ xóa những bản ghi tương ứng khỏi những bảng cơ sở của khung nhìn có tên là Employee_Personal_Details và Employee_Salary_Details.

CREATE TRIGGER Delete_Employees
ON Employee_Details_View
INSTEAD OF DELETE
AS
BEGIN
DELETE FROM Employee_Salary_Details WHERE EmpID IN
(SELECT EmpID FROM deleted)
DELETE FROM Employee_Personal_Details WHERE EmpID IN
(SELECT EmpID FROM deleted)

Đoạn mã dưới đây xóa một hàng khỏi khung nhìn Employee_Details_View trong đó EmpID='3'.

DELETE FROM Employee_Details _View WHERE EmpID='3'
» Tiếp: IF-ELSE
« Trước: Trigger AFTER
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!