Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Kích hoạt SQL Server:Kích hoạt DML

Trong SQL Server, trình kích hoạt là các đối tượng cơ sở dữ liệu được thực thi bất cứ khi nào một sự kiện kích hoạt xảy ra trên cơ sở dữ liệu hoặc máy chủ.

Trình kích hoạt đóng một vai trò quan trọng trong việc đạt được các yêu cầu của Doanh nghiệp như cảnh báo những người được nhắm mục tiêu, bắt đầu một công việc hoặc các hoạt động khác. Vì Trình kích hoạt có thể xử lý nhiều hoạt động như vậy, chúng ta nên xác định chúng cẩn thận để tránh ảnh hưởng đến hiệu suất.

Trong bài viết này, chúng tôi sẽ xem xét các Trình kích hoạt, các loại Trình kích hoạt và các tùy chọn Trình kích hoạt khác nhau có sẵn. Ngoài ra, chúng ta sẽ khám phá các biện pháp phòng ngừa cần thiết khi sử dụng trình kích hoạt DML.

Trình kích hoạt trong SQL

Trigger là một loại thủ tục được lưu trữ đặc biệt được thực thi dựa trên các sự kiện đã xác định, chạy tập lệnh được xác định trong phần thân Trigger. Có một số loại trình kích hoạt:

  • Trình kích hoạt DML - để thực hiện các thao tác DML như lệnh INSERT, UPDATE và DELETE trên bảng.
  • Trình kích hoạt DDL - để thực hiện các hoạt động DDL như lệnh CREATE, ALTER và DROP trên bất kỳ đối tượng nào trên Cơ sở dữ liệu hoặc Máy chủ.
  • Trình kích hoạt đăng nhập - để cố gắng đăng nhập vào một phiên bản của SQL Server trong sự kiện LOGON.

Kích hoạt DML trong SQL Server

Trình kích hoạt DML là những kích hoạt được kích hoạt bởi các lệnh DML (CHÈN, CẬP NHẬT hoặc XÓA) trên các bảng hoặc dạng xem. Chúng tôi chỉ có thể tạo các Trình kích hoạt như vậy trên các bảng hoặc dạng xem nơi có dữ liệu để chúng chấp nhận các lệnh DML trên đó.

Dựa trên thời gian kích hoạt / gọi, trình kích hoạt DML có thể thuộc các loại sau:

  • CHO hoặc SAU ĐÓ Loại trình kích hoạt - trình kích hoạt được gọi sau khi hoàn thành thành công câu lệnh DML trên bảng hoặc dạng xem. Lưu ý:chỉ có thể tạo trình kích hoạt SAU trên Bảng chứ không phải Chế độ xem.
  • INSTEAD OF Loại trình kích hoạt - Trình kích hoạt sẽ được gọi trước (INSTEAD OF) tập lệnh DML được thực thi trên Bảng hoặc dạng xem.

SQL Server tạo hai bảng logic hoặc đặc biệt có tên là INSERTED CẬP NHẬT bất cứ khi nào trình kích hoạt DML được tạo trên các Bảng hoặc dạng xem. Các bảng logic này giúp xác định các thay đổi bản ghi xảy ra thông qua các thao tác CHÈN / CẬP NHẬT / XÓA. Bằng cách này, nó đảm bảo rằng trình kích hoạt DML hoạt động hiệu quả.

  • ĐÃ CHÈN bảng logic lưu trữ các bản sao của các bản ghi mới của các bản ghi được sửa đổi trong quá trình INSERT và UPDATE. Khi một bản ghi mới được thêm vào bảng thực tế, nó cũng được thêm vào bảng INSERTED. Tương tự, bất kỳ thay đổi nào trên các bản ghi hiện có thông qua câu lệnh UPDATE sẽ di chuyển các giá trị mới nhất sang bảng INSERTED và các giá trị cũ hơn - sang bảng logic ĐÃ XÓA.
  • ĐÃ XÓA bảng logic lưu trữ các bản sao của các giá trị cũ hơn trong các hoạt động CẬP NHẬT và XÓA. Bất cứ khi nào bản ghi được cập nhật, các giá trị cũ hơn sẽ được sao chép vào bảng ĐÃ XÓA. Bất cứ khi nào một bản ghi bị xóa khỏi bảng thực tế, các bản ghi sẽ được chèn vào bảng ĐÃ XÓA.

SQL Server tích hợp sẵn các hàm COLUMN_UPDATED () UPDATE () để xác định sự hiện diện của các thao tác CHÈN hoặc CẬP NHẬT trên cột cụ thể.

  • COLUMN_UPDATED () trả về giá trị varbinary của các cột bị ảnh hưởng bởi các thao tác INSERT hoặc UPDATE.
  • CẬP NHẬT () chấp nhận tên cột làm tham số đầu vào và trả về thông tin cho dù cột đó có bất kỳ thay đổi dữ liệu nào như một phần của hoạt động CHÈN hoặc CẬP NHẬT hay không.

Sự kiện KHÔNG DÀNH CHO THAY THẾ thuộc tính có thể được sử dụng trong trình kích hoạt DML để tránh kích hoạt chúng đối với các thay đổi đến qua quá trình Sao chép.

Trình kích hoạt DML cũng có thể được tạo bằng .Net Framework Common Language Runtime (CLR).

Hệ thống DMV sys.triggers lưu trữ danh sách tất cả các trình kích hoạt trong phạm vi cơ sở dữ liệu. Chúng tôi có thể sử dụng truy vấn dưới đây để tìm nạp chi tiết của tất cả các trình kích hoạt DML trong Cơ sở dữ liệu:

SELECT * 
FROM sys.triggers
WHERE type = 'TR';

Các định nghĩa về Trình kích hoạt DML có thể được xem nếu trình kích hoạt không được mã hóa. Chúng tôi sử dụng bất kỳ tùy chọn nào dưới đây:

sys.sql_modules

SELECT OBJECT_SCHEMA_NAME(object_id, db_id()) Schema_name, OBJECT_NAME(object_id) Trigger_Name, definition
FROM sys.sql_modules  
WHERE object_id = OBJECT_ID(<trigger_name>);   

OBJECT_DEFINITION () chức năng

SELECT OBJECT_DEFINITION (OBJECT_ID(<trigger_name>)) AS ObjectDefinition; 

sp_helptext thủ tục được lưu trữ

EXEC sp_helptext '<trigger_name>';

Tất cả các Sự kiện DML có thể có trong sys.events bàn. Chúng tôi có thể xem chúng bằng cách sử dụng truy vấn dưới đây:

SELECT * 
FROM sys.events;

Cú pháp của Trình kích hoạt DML

CREATE TRIGGER <trigger_name>
ON <schema_name.table_name | schema_name.view_name > 
[ WITH <DML_trigger_option> [ ,...n ] ]  
{ FOR | AFTER | INSTEAD OF} <event_type>
AS { sql_statement | EXTERNAL NAME <method specifier> }  

Vì mục đích demo, tôi đã tạo hai bảng có tên Bán hàng SalesHistory với vài cột trong cơ sở dữ liệu thử nghiệm:

CREATE TABLE Sales (SalesId int IDENTITY NOT NULL, SalesDate datetime, Itemcount int, price money);
CREATE TABLE SalesHistory (SalesId int NOT NULL, SalesDate datetime, Itemcount int, price money, ChangeType varchar(10), ChangeDate datetime DEFAULT GETDATE(), ChangedUser varchar(100) DEFAULT SUSER_NAME());
GO

Như bạn có thể thấy, Lịch sử bán hàng bảng có 3 cột bổ sung để theo dõi ngày sửa đổi và tên người dùng đã tạo ra thay đổi. Nếu được yêu cầu, chúng tôi có thể có thêm một cột nhận dạng đã xác định và biến nó thành Khóa chính.

INSERT Trigger

Chúng tôi tạo một trình kích hoạt CHÈN đơn giản trên Bán hàng bảng để CHÈN bất kỳ thay đổi bản ghi mới nào đối với SalesHistory bàn. Sử dụng tập lệnh dưới đây:

CREATE TRIGGER TR_INS_Sales ON Sales
FOR INSERT 
AS
BEGIN
  INSERT INTO SalesHistory(SalesId,SalesDate,Itemcount,price,ChangeType)
  SELECT SalesId
    	,SalesDate
	,Itemcount
	,price
	,'INSERT'
  FROM inserted
END
GO

Để giải thích cú pháp trình kích hoạt, chúng tôi đã tạo trình kích hoạt DML có tên TR_INS_Sales về Bán hàng bàn. Nó phải kích hoạt trình kích hoạt chỉ cho các hoạt động INSERT - chèn các bản ghi vào Danh sách bán hàng bảng từ bảng đã chèn.

Như chúng ta đã biết, đã chèn là một bảng logic ghi lại những thay đổi xảy ra trong bảng Nguồn ( Bán hàng trong trường hợp của chúng tôi).

Chúng ta có thể thấy một bảng logic đặc biệt khác đã bị xóa trong trình kích hoạt CẬP NHẬT vì đã xóa bảng không áp dụng cho trình kích hoạt INSERT.

Hãy thêm bản ghi mới để kiểm tra xem bản ghi có được chèn vào Danh sách bán hàng không bảng tự động.

INSERT INTO Sales(SalesDate,Itemcount,price)
VALUES ('2021-01-01', 5, 100);

Mặc dù chúng tôi chỉ chèn một bản ghi vào Bán hàng bảng, chúng tôi nhận được 2 dòng của 1 hàng bị ảnh hưởng tin nhắn. Bản ghi thứ hai xuất hiện do thao tác INSERT như một phần của trình kích hoạt được gọi bởi hoạt động INSERT trên Bán hàng bảng - chèn bản ghi vào Lịch sử bán hàng bảng.

Hãy xác minh hồ sơ trên cả Bán hàng SalesHistory bảng:

SELECT * 
FROM Sales

SELECT * 
FROM SalesHistory

Chúng ta có thể thấy rằng Ngày thay đổi ChangedUser được tự động điền. Đó là bởi vì chúng tôi đã thiết kế Lịch sử của mình bảng với các giá trị mặc định là GETDATE () SUSER_NAME () .

Người dùng cuối có thể nhìn thấy qua Trình kích hoạt hoặc một số phương tiện khác có nghĩa là INSERT của họ đã được kiểm tra thông qua 1 hàng bị ảnh hưởng bổ sung tin nhắn. Nếu bạn muốn theo dõi các thay đổi mà không thông báo cho người dùng, bạn cần áp dụng BẬT TÀI KHOẢN TIỀN TỆ yêu cầu. Nó ngăn chặn các kết quả được hiển thị cho các hoạt động DML xảy ra bên trong trình kích hoạt.

Hãy ALTER kích hoạt của chúng tôi bằng cách sử dụng tập lệnh có BẬT TÀI KHOẢN TIỀN TỆ và xem nó hoạt động:

ALTER TRIGGER TR_INS_Sales ON Sales
FOR INSERT 
AS
BEGIN
SET NOCOUNT ON
  INSERT INTO SalesHistory(SalesId,SalesDate,Itemcount,price,ChangeType)
  SELECT SalesId
    ,SalesDate
	,Itemcount
	,price
	,'INSERT'
  FROM inserted
END
GO

Bây giờ, chúng tôi chèn một bản ghi khác vào Bán hàng bảng:

INSERT INTO Sales(SalesDate,Itemcount,price)
VALUES ('2021-02-01', 1, 50);

Chúng tôi chỉ có thể thấy một 1 hàng bị ảnh hưởng tin nhắn. Do đó, đối tượng mục tiêu có thể không nhận được thông báo rằng hành động của họ đang được giám sát.

Hãy xác minh xem trình kích hoạt INSERT có được gọi hay không bằng cách xác minh Bán hàng SalesHistory bảng.

Có, sự kiện INSERT trên Bán hàng bảng đã được kích hoạt thành công. Các bản ghi đã được chèn vào SalesHistory bảng mà không thông báo cho người dùng.

Do đó, nếu bạn tạo trình kích hoạt cho mục đích kiểm tra, thì ĐẶT SỐ TÀI KHOẢN là cần thiết. Nó cho phép kiểm tra mà không cần cảnh báo cho bất kỳ ai.

UPDATE Trigger

Trước khi tạo trình kích hoạt CẬP NHẬT thực tế trên Bán hàng bảng, chúng ta hãy tham khảo một lần nữa các bảng được chèn và xóa hợp lý đặc biệt. Tạo trình kích hoạt CẬP NHẬT mẫu trên Bán hàng bảng:

CREATE TRIGGER TR_UPD_Sales ON Sales
FOR UPDATE 
AS
BEGIN
SELECT * FROM inserted
SELECT * FROM deleted
END
GO

Trình kích hoạt CẬP NHẬT đã được tạo thành công. Bây giờ, hãy CHÈN một bản ghi mới không chính xác. Sau đó, chúng tôi sẽ cập nhật nó để xác minh trình kích hoạt CẬP NHẬT đang hoạt động:

INSERT INTO Sales(SalesDate,Itemcount,price)
VALUES ('2021-02-01', 1, 50);

Chúng tôi có các bản ghi dưới đây về Bán hàng SalesHistory bảng:

Hãy cập nhật SalesId =3 trong Bán hàng bảng với các giá trị mới. Chúng ta sẽ thấy dữ liệu trên các bảng đã chèn và đã xóa:

UPDATE Sales
SET SalesDate = '2021-03-01'
	, Itemcount = 3
	, price = 500
WHERE SalesId = 3

Khi thao tác CẬP NHẬT diễn ra, tất cả các giá trị mới hoặc đã sửa đổi sẽ có sẵn trong bảng được chèn và các giá trị cũ sẽ có sẵn trong bảng đã xóa:

Bây giờ, hãy sửa đổi trình kích hoạt CẬP NHẬT bằng tập lệnh bên dưới và xác minh nó hoạt động:

ALTER TRIGGER TR_UPD_Sales ON Sales
FOR UPDATE 
AS
BEGIN
  INSERT INTO SalesHistory(SalesId,SalesDate,Itemcount,price,ChangeType)
  SELECT SalesId
    ,SalesDate
	,Itemcount
	,price
	,'UPDATE'
  FROM inserted
END
GO

Trình kích hoạt UPDATE đã được thay đổi thành công và chúng tôi có thể thực thi lại cùng một tập lệnh UPDATE:

Bây giờ, chúng ta có thể thấy 1 hàng bị ảnh hưởng nhắn hai lần. Nó cho biết việc thực hiện thao tác CẬP NHẬT đối với Bán hàng và thao tác INSERT trên Danh sách bán hàng bàn. Hãy xác minh điều này bằng cách chọn trên cả hai bảng:

Hoạt động UPDATE đã được theo dõi trong Danh sách bán hàng bảng như một bản ghi mới. Trước bản ghi đó, chúng tôi có một bản ghi khác hiển thị thời điểm bản ghi được chèn trước.

Trình kích hoạt XÓA

Cho đến bây giờ, chúng tôi đã thử nghiệm FOR hoặc SAU ĐÓ loại trình kích hoạt cho cả thao tác CHÈN hoặc CẬP NHẬT. Bây giờ, chúng tôi có thể thử sử dụng INSTEAD OF loại trình kích hoạt DML cho thao tác DELETE. Sử dụng tập lệnh dưới đây:

CREATE TRIGGER TR_DEL_Sales ON Sales
INSTEAD OF DELETE 
AS
BEGIN
	RAISERROR ('Notify Sales Team', 16, 10);  
END
GO

Trình kích hoạt DELETE được tạo thành công. Nó sẽ gửi thông báo lỗi cho khách hàng thay vì thực hiện lệnh DELETE trên Bán hàng bảng.

Hãy thử xóa bản ghi SalesID =3 từ Bán hàng bảng sử dụng tập lệnh bên dưới:

DELETE FROM Sales
WHERE SalesId = 3

Chúng tôi đã ngăn người dùng xóa hồ sơ khỏi Bán hàng bàn. Trình kích hoạt đưa ra thông báo lỗi.

Hãy cũng xác minh xem bản ghi có bị xóa khỏi Bán hàng hay không và nếu có bất kỳ thay đổi nào trên Danh sách bán hàng bảng:

Vì chúng tôi đã thực thi tập lệnh kích hoạt trước câu lệnh DELETE thực sự bằng cách sử dụng kích hoạt INSTEAD OF, hoạt động DELETE trên SalesId =3 hoàn toàn không thành công. Do đó, không có thay đổi nào được phản ánh trên cả Bán hàng SalesHistory bảng.

Hãy sửa đổi trình kích hoạt bằng cách sử dụng tập lệnh bên dưới để xác định nỗ lực XÓA trên bảng:

ALTER TRIGGER TR_DEL_Sales ON Sales
INSTEAD OF DELETE 
AS
BEGIN
  INSERT INTO SalesHistory(SalesId,SalesDate,Itemcount,price,ChangeType)
  SELECT SalesId
    ,SalesDate
	,Itemcount
	,price
	,'DELETE ATP'
  FROM deleted 
END
GO

Trình kích hoạt đã được sửa đổi thành công. Hãy xóa SalesId =3 bản ghi từ Bán hàng bảng lại:

Việc thực thi câu lệnh DELETE hiển thị 1 hàng bị ảnh hưởng nhắn hai lần. Hãy kiểm tra hồ sơ trên Bán hàng SalesHistory để xem chính xác những gì xảy ra ở đó:

Logic được sử dụng trong Trình kích hoạt DELETE là ghi lại mọi nỗ lực DELETE trên bảng mà không thực sự xóa bản ghi khỏi Bán hàng bảng sử dụng INSTEAD OF cò súng. Chúng tôi có thể xác nhận rằng hồ sơ không bị xóa khỏi Bán hàng và một bản ghi mới đã được chèn vào Danh sách bán hàng bảng.

Một kích hoạt duy nhất để xử lý thao tác CHÈN, CẬP NHẬT và XÓA

Cho đến bây giờ, chúng tôi đã tạo 3 trình kích hoạt để xử lý các hoạt động CHÈN, CẬP NHẬT và XÓA trên một bảng duy nhất. Nếu chúng ta có nhiều trình kích hoạt, sẽ rất khó để quản lý chúng, đặc biệt nếu chúng không được ghi lại đúng cách. Có thể có vấn đề về hiệu suất nếu các nhà phát triển sử dụng logic mâu thuẫn trên nhiều trình kích hoạt.

Cá nhân tôi khuyên bạn nên sử dụng một trình kích hoạt duy nhất với tất cả logic được kết hợp để tránh các vấn đề về hiệu suất hoặc mất dữ liệu tiềm ẩn. Chúng tôi có thể thử kết hợp 3 trình kích hoạt trong một trình kích hoạt duy nhất để có hiệu suất tốt hơn. Nhưng trước khi thực hiện, chúng ta hãy kiểm tra cách XÓA các trình kích hoạt hiện có và cách Tắt hoặc Bật trình kích hoạt.

Bỏ trình kích hoạt

Để hợp nhất 3 trình kích hoạt thành một trình kích hoạt duy nhất, trước tiên chúng ta cần TẮT 3 trình kích hoạt này. Có thể thực hiện được thông qua cả hai cách tiếp cận SSMS và T-SQL.

Trong SSMS, hãy mở rộng Kiểm tra cơ sở dữ liệu > Bảng > Bán hàng bảng> Trình kích hoạt .

Chúng tôi có thể thấy 3 trình kích hoạt của chúng tôi đã được tạo cho đến nay:

Để thả trình kích hoạt, chỉ cần nhấp chuột phải vào nó> Xóa > Được .

Nếu bạn thích sử dụng T-SQL, hãy xem cú pháp bên dưới để thả trình kích hoạt:

DROP TRIGGER <trigger_name>

TR_INS_Sales kích hoạt chúng tôi đã tạo trên Bán hàng bàn. Tập lệnh sẽ là:

DROP TRIGGER TR_INS_Sales

Quan trọng :Việc giảm một bảng sẽ làm giảm tất cả các trình kích hoạt theo mặc định.

Tắt và bật trình kích hoạt

Thay vì bỏ trình kích hoạt, chúng tôi có thể tắt tạm thời bằng nút Tắt trình kích hoạt tùy chọn qua SSMS hoặc T-SQL.

Trong SSMS, nhấp chuột phải vào Tên trình kích hoạt > Tắt . Sau khi bị vô hiệu hóa, trình kích hoạt sẽ không được kích hoạt cho đến khi bạn bật lại.

Trong khi Trình kích hoạt đang hoạt động, nút Bật tùy chọn chuyển sang màu xám. Khi bạn tắt nó, nút Bật tùy chọn sẽ hiển thị và hoạt động.

Nếu bạn thích sử dụng T-SQL, bạn có thể tắt và bật trình kích hoạt bằng cách sử dụng các tập lệnh dưới đây:

-- To Disable all triggers on a specific table
DISABLE TRIGGER ALL ON <table_name>;

-- To Disable a specific trigger on a table
DISABLE TRIGGER <trigger_name> ON <table_name>;

-- To Enable all triggers on a specific table
ENABLE TRIGGER ALL ON <table_name>;

-- To Enable a specific trigger on a table
ENABLE TRIGGER <trigger_name> ON <table_name>;

Để tắt và bật TR_INS_Sales cụ thể của chúng tôi kích hoạt Bán hàng bảng, chúng tôi sử dụng các tập lệnh dưới đây:

-- To Disable TR_INS_Sales trigger on Sales table
DISABLE TRIGGER TR_INS_Sales ON Sales;

-- To Enable TR_INS_Sales trigger on Sales table
ENABLE TRIGGER TR_INS_Sales ON Sales;

Như vậy, chúng ta đã học cách DROP , TẮT BẬT gây nên. Tôi sẽ bỏ 3 trình kích hoạt hiện có và tạo một trình kích hoạt duy nhất bao gồm tất cả 3 hoạt động hoặc chèn, cập nhật và xóa bằng cách sử dụng tập lệnh bên dưới:

DROP TRIGGER TR_INS_Sales
DROP TRIGGER TR_UPD_Sales
DROP TRIGGER TR_DEL_Sales
GO

CREATE TRIGGER TR_INS_UPD_DEL_Sales ON Sales
FOR INSERT, UPDATE, DELETE
AS
BEGIN
IF (SELECT COUNT (*) FROM deleted) = 0
BEGIN
  INSERT INTO SalesHistory(SalesId,SalesDate,Itemcount,price,ChangeType)
  SELECT SalesId
    ,SalesDate
	,Itemcount
	,price
	,'INSERT'
  FROM inserted
END
ELSE IF (SELECT COUNT (*) FROM inserted) = 0
BEGIN
  INSERT INTO SalesHistory(SalesId,SalesDate,Itemcount,price,ChangeType)
  SELECT SalesId
    ,SalesDate
	,Itemcount
	,price
	,'DELETE'
  FROM deleted
END
ELSE IF (UPDATE (SalesDate) OR UPDATE (ItemCount) OR UPDATE (Price))
BEGIN
  INSERT INTO SalesHistory(SalesId,SalesDate,Itemcount,price,ChangeType)
  SELECT SalesId
    ,SalesDate
	,Itemcount
	,price
	,'UPDATE'
  FROM inserted
END 
END
GO

Việc tạo trình kích hoạt duy nhất đã thành công. Chúng tôi đã sử dụng logic để xác định hoạt động bằng cách sử dụng các bảng được chèn và xóa.

Đối với thao tác INSERT, bảng đã xóa sẽ không được điền. Đối với thao tác XÓA, bảng đã chèn sẽ không được điền. Chúng ta có thể xác định các thao tác này một cách dễ dàng. Nếu 2 điều kiện này không khớp thì đó là thao tác CẬP NHẬT và chúng ta có thể sử dụng câu lệnh ELSE đơn giản.

Tôi đã sử dụng UPDATE () chức năng để hiển thị cách nó hoạt động. Nếu có bất kỳ cập nhật nào trên các cột đó, hành động kích hoạt CẬP NHẬT sẽ kích hoạt. Chúng tôi cũng có thể sử dụng COLUMNS_UPDATED () chức năng mà chúng ta đã thảo luận trước đó để xác định cả hoạt động CẬP NHẬT.

Hãy thử nghiệm trình kích hoạt mới của chúng tôi bằng cách chèn một bản ghi mới:

INSERT INTO Sales(SalesDate,Itemcount,price)
VALUES ('2021-04-01', 4, 400);

Xác minh hồ sơ trên Bán hàng SalesHistory bảng hiển thị dữ liệu như sau:

Hãy thử cập nhật SalesId =2 ghi:

UPDATE Sales
SET price = 250
WHERE SalesId = 2;

Hãy thử tập lệnh DELETE thông qua quy trình này trên SalesId =4 ghi:

DELETE FROM Sales
WHERE SalesId = 4;

Như chúng ta có thể nhận thấy, SalesId =4 đã bị xóa khỏi Bán hàng vì đây là FOR hoặc SAU ĐÓ kích hoạt, làm cho hoạt động XÓA thành công trên Bán hàng và sau đó chèn bản ghi vào Lịch sử bán hàng bảng.

Mục đích của Trình kích hoạt DML

Trình kích hoạt DML phục vụ hiệu quả cho các trường hợp sau:

  1. Theo dõi các thay đổi lịch sử của các thao tác CHÈN, CẬP NHẬT và XÓA trên một bảng cụ thể.
  2. Kiểm tra các sự kiện DML xảy ra trên bảng mà không để lộ hoạt động Kiểm tra cho người dùng.
  3. Ngăn các thay đổi DML xảy ra trên bảng qua INSTEAD OF kích hoạt và cảnh báo người dùng bằng một thông báo lỗi cụ thể.
  4. Gửi thông báo cho những người được nhắm mục tiêu khi đạt được bất kỳ điều kiện nào được xác định trước.
  5. Bắt đầu Công việc Tác nhân Máy chủ SQL hoặc bất kỳ quy trình nào khác bất cứ khi nào đạt được bất kỳ điều kiện xác định trước nào.

Và, bạn có thể sử dụng chúng cho bất kỳ yêu cầu logic nghiệp vụ nào khác mà bạn có thể triển khai với các câu lệnh T-SQL.

Kết luận

Phần thân trình kích hoạt DML tương tự như quy trình được lưu trữ. Chúng tôi có thể triển khai bất kỳ logic Kinh doanh nào được yêu cầu, nhưng chúng tôi phải cẩn thận trong khi viết logic liên quan để tránh các vấn đề tiềm ẩn.

Mặc dù SQL Server hỗ trợ tạo nhiều trình kích hoạt trên một bảng, nhưng tốt hơn hết bạn nên hợp nhất thành một Trình kích hoạt duy nhất. Bằng cách này, bạn có thể duy trì các trình kích hoạt một cách dễ dàng và khắc phục sự cố nhanh hơn. Bất cứ khi nào trình kích hoạt DML được triển khai cho mục đích kiểm tra, hãy đảm bảo rằng ĐẶT SỐ TÀI KHOẢN tùy chọn được sử dụng hiệu quả.

Trong bài viết tiếp theo, chúng ta sẽ xem xét trình kích hoạt DDL và Trình kích hoạt đăng nhập.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách bật CDC trên Tập hợp bảng HOẶC Bật trên tất cả các bảng trong cơ sở dữ liệu trong SQL Server - Hướng dẫn sử dụng SQL Server

  2. Lỗi kết nối RODBC odbcDriverConnect ()

  3. Làm cách nào để xem các kết nối SQL Server đang hoạt động?

  4. Hướng dẫn:Thiết lập tính khả dụng cao của SQL Server

  5. Ví dụ về DATEDIFF () trong SQL Server