-
Thiết lập ban đầu
-
Các khái niệm cơ bản
-
Nhóm Truy vấn dữ liệu với SELECT
-
Nhóm thao tác dữ liệu
-
Các nhóm hàm xử lý
-
Hàm trong SQL
-
Các thao tác mở rộng
-
TÀI LIỆU THAM KHẢO CHO LẬP TRÌNH ABAP
Trình kích hoạt TRIGGERS trong SQL
Trình kích hoạt TRIGGERS trong SQL
Giới thiệu
Triggers
Triggers là các chương trình được lưu trữ được tự động thực thi hoặc kích hoạt khi một số sự kiện xảy ra. Nó là một đối tượng cơ sở dữ liệu được liên kết với một bảng và được thực thi tự động. Chúng tôi không thể gọi bất kỳ trình triggers nào một cách rõ ràng. Trình triggers cung cấp tính toàn vẹn của dữ liệu và được sử dụng để truy cập và kiểm tra dữ liệu trước và sau khi sửa đổi bằng cách sử dụng truy vấn DDL hoặc DML.
Triggers được sử dụng trong các sự kiện sau
- DML (Ngôn ngữ thao tác dữ liệu)(Insert ,Update ,Delete).
- DDL (Ngôn ngữ định nghĩa dữ liệu)(Create, Alter, Drop).
- Hoạt động cơ sở dữ liệu như LOGON, LOGOFF, SERVERERROR, SHUTDOWN, STARTUP.
Đầu tiên, tạo một bảng như sau:
- Create Table Student
- (
- IId int Not Null primary key,
- Name Nvarchar(MAX) Not NUll,
- Age Int Not Null,
- Class int not Null
- )
Bây giờ hãy chèn một số giá trị vào bảng như sau:
- Insert Into Student
- Select 1,‘A’,12,10 Union All
- Select 2,‘B’,16,11 Union All
- Select 3,‘C’,15,9 Union All
- Select 4,‘D’,13,12 Union All
- Select 5,‘E’,14,11 Union All
- Select 6,‘F’,17,8 Union All
- Select 7,‘G’,12,7 Union All
- Select 8,‘H’,17,12
Lúc này bảng sẽ có dạng như sau:
- CREATE [OR REPLACE ] TRIGGER Trigger_Name
- ON Table_Name
- {BEFORE | AFTER | INSTEAD OF }
- {INSERT [OR] | UPDATE [OR] | DELETE}
- AS
- Begin
- Declaration Part
- {
- }
- Select Part
- {
- // Initialize Variables
- }
- Executable-Code
- EXCEPTION
- Exception-Handling-Code
- END;
Các loại Trình kích hoạt DML Triggers
Triggers có ba loại sau,
- After Triggers
- Instead Of Triggers
After Triggers
Sau khi trình triggers được gọi sau các thao tác DML (insert, update and delete). Chúng không được hỗ trợ bởi quan điểm. Một after triggers cũng được chia làm 3 phần như sau:
- After Insert
- After Delete
- After Update
After Insert
Ví dụ
Một After Insert Trigger được gọi sau khi bất kỳ dữ liệu nào được chèn vào bảng.
- Create Trigger My_Trigger On Student
- AFTER Insert
- AS
- Declare @IId int ;
- Declare @Name Nvarchar(50) ;
- Declare @Age Int;
- Declare @Class int;
- Select @IId= Tab.IId From inserted Tab;
- Select @Name= Tab.Name From inserted Tab;
- Select @Age= Tab.Age From inserted Tab;
- Select @Class= Tab.Class From inserted Tab;
- Set @IId=@IId+1;
- Insert Into Student(IId,Name , Age ,Class) Values (@IId,@Name,@Age,@Class)
- Print ‘Inserted Successfully’
Bây giờ chúng ta sẽ chèn một số giá trị vào Student Table.
Insert Into Student(IId,Name,Age,Class) values(10,’Pankaj’,21,12)
Đầu ra
Inserted Successfully
(1 row(s) affected)
After Delete
After Delete Triggers được gọi sau khi bất kỳ dữ liệu nào bị xóa khỏi bảng.
- Create Trigger After_Delete On Student
- AFTER Delete
- AS
- Declare @IId int ;
- Declare @Name Nvarchar(50) ;
- Declare @Age Int;
- Declare @Class int;
- Select @IId= Tab.IId From Deleted Tab;
- Select @Name= Tab.Name From Deleted Tab;
- Select @Age= Tab.Age From Deleted Tab;
- Select @Class= Tab.Class From Deleted Tab;
- if @IId>10
- begin
- Insert Into Student(IId,Name , Age ,Class) Values (@IId,@Name,@Age,@Class)
- Print ‘Data Deleted Successfully’
- End
- else
- Begin
- Print ‘Data not Deleted Successfully’
- End
Bây giờ chúng ta sẽ xóa một số dữ liệu khỏi bảng:
Data Deleted Successfully
(1 row(s) affected)
(0 row(s) affected)
After Update
Một After Update Trigger được gọi sau khi bất kỳ loại cập nhật nào được thực hiện trên bảng.
- Create Trigger After_Update On Student
- AFTER Update
- AS
- Declare @IId int ;
- Declare @Name Nvarchar(50) ;
- Declare @Age Int;
- Declare @Class int;
- Declare @IId1 int ;
- Declare @Name1 Nvarchar(50) ;
- Declare @Age1 Int;
- Declare @Class1 int;
- Select @IId= Tab.IId From Deleted Tab;
- Select @Name= Tab.Name From Deleted Tab;
- Select @Age= Tab.Age From Deleted Tab;
- Select @Class= Tab.Class From Deleted Tab;
- Select @IId1= Tab.IId From inserted Tab;
- Select @Name1= Tab.Name From inserted Tab;
- Select @Age1= Tab.Age From inserted Tab;
- Select @Class1= Tab.Class From inserted Tab;
- Set @IId1=@IId1+1;
- if @IId>10
- begin
- Delete From Student Where IId=@iid
- Insert Into Student(IId,Name , Age ,Class) Values (@IId1,@Name1,@Age1,@Class1)
- Print ‘Data Updated Successfully’
- End
- else
- Begin
- Print ‘Data not Updated Successfully’
- End
Bây giờ chúng ta sẽ cập nhật một số dữ liệu.
(1 row(s) affected)
Data Updated Successfully
(1 row(s) affected)
Vì vậy, chúng ta có thể sử dụng cả hai bảng ma thuật trong trình “After Update” trigger.
Instead of Triggers
Chúng có thể được sử dụng như một công cụ chặn cho bất kỳ điều gì mà bất kỳ ai cố gắng thực hiện trên bảng hoặc chế độ xem của chúng ta. Loại trình kích hoạt này kích hoạt trước khi SQL Server bắt đầu thực hiện hành động đã kích hoạt nó. Chúng ta có thể có một INSTEAD OF insert/update/delete trigger trên một bảng đã được thực thi thành công nhưng không bao gồm thao tác insert/update/delete thực tế đối với bảng.
Các loại Instead Of Triggers
- Instead Of Insert
- Instead Of Update
- Instead Of Delete
Bảng trước khi thực hiện “Instead Of Delete”.
Bây giờ chúng ta tạo một “Instead Of Trigger“.
- Create Trigger Insted_Delete On Student
- Instead Of Delete
- as
- begin
- Declare @IId int ;
- Declare @Name Nvarchar(50) ;
- Declare @Age Int;
- Declare @Class int;
- Select @IId= Tab.IId From Deleted Tab;
- Select @Name= Tab.Name From Deleted Tab;
- Select @Age= Tab.Age From Deleted Tab;
- Select @Class= Tab.Class From Deleted Tab;
- Set @IId=@IId+1;
- Insert Into Student(IId,Name , Age ,Class) Values (@IId,@Name,@Age,@Class)
- Print ‘Data Updated Successfully’
- End
Sau đó, chúng ta cố gắng xóa một số dữ liệu khỏi dữ liệu và kiểm tra kết quả.
Chúng ta có thể thấy rằng chúng ta thực hiện truy vấn xóa bản ghi sinh viên khỏi bảng có IId bằng 8 nhưng trong bản ghi kết quả với IId = 3 nó không bị xóa vì dữ liệu sẽ không xóa khỏi bảng trừ khi chúng ta thực hiện một hướng dẫn xóa khác từ bên trong trình kích hoạt.
Bây giờ chúng ta tạo một trình kích hoạt khác có chứa lệnh Delete Command.
- Create Trigger Insted_Delete1 On Student
- Instead Of Delete
- as
- begin
- Declare @IId int ;
- Declare @Name Nvarchar(50) ;
- Declare @Age Int;
- Declare @Class int;
- Select @IId= Tab.IId From Deleted Tab;
- Select @Name= Tab.Name From Deleted Tab;
- Select @Age= Tab.Age From Deleted Tab;
- Select @Class= Tab.Class From Deleted Tab;
- Delete From Student Where IId=@IId
- Set @IId=@IId+1;
- Insert Into Student(IId,Name , Age ,Class) Values (@IId,@Name,@Age,@Class)
- Print ‘Data Updated Successfully’
- End
Bây giờ chúng ta thực hiện thao tác xóa trên bảng.
Xếp tầng theo chu kỳ trong Trigger
Đây là một tình huống không mong muốn khi có nhiều hơn một trình kích hoạt tham gia vào một vòng lặp vô hạn. Khi tạo trình kích hoạt, chúng ta nên đảm bảo rằng tình huống như vậy không thể xảy ra. Tình huống này có thể xảy ra khi hai trình kích hoạt tạo một vòng lặp.
Hãy để chúng ta tạo hai trình trigger như sau:
- Trình kích hoạt đầu tiên dành cho phần chèn như sau:
- Create Trigger [dbo].[Insert_] On [dbo].[Student]
- For Insert
- as
- begin
- Declare @IId int ;
- Declare @Name Nvarchar(50) ;
- Declare @Age Int;
- Declare @Class int;
- Select @IId= Tab.IId From inserted Tab;
- Select @Name= Tab.Name From inserted Tab;
- Select @Age= Tab.Age From inserted Tab;
- Select @Class= Tab.Class From inserted Tab;
- Update Student set Name=@Name ,Age=@Age where IId=@IId
- Print ‘Data Inserted Successfully’
- End
- Và trình kích hoạt thứ hai dành cho một bản cập nhật như sau:
- Create Trigger [dbo].[Update_] On [dbo].[Student]
- For Update
- as
- begin
- Declare @IId int ;
- Declare @Name Nvarchar(50) ;
- Declare @Age Int;
- Declare @Class int;
- Select @IId= Tab.IId From inserted Tab;
- Select @Name= Tab.Name From inserted Tab;
- Select @Age= Tab.Age From inserted Tab;
- Select @Class= Tab.Class From inserted Tab;
- Set @IId=@IId+1;
- Insert Into Student(IId,Name , Age ,Class) Values (@IId,@Name,@Age,@Class)
- Print ‘Data Updated Successfully’
- End
Bây giờ chúng ta chèn một số dữ liệu vào bảng và kiểm tra điều gì sẽ xảy ra.
Đầu ra
Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).
Trình kích hoạt đầu tiên (Insert_) chứa câu lệnh cập nhật. Khi câu lệnh này thực thi, nó tạo ra một lệnh gọi cho trình Update_trigger có chứa một câu lệnh chèn để khi câu lệnh này thực thi, nó sẽ tạo ra một lệnh gọi cho trình Insert_trigger. Vì vậy, một vòng lặp vô hạn sẽ xảy ra.
Bản tóm tắt
(Source: https://www.c-sharpcorner.com/)