SQL Server 中的 AFTER UPDATE 触发器

SQL Server 中的 AFTER UPDATE 触发器将在表上的 Update 操作完成后触发。SQL After UPDATE Triggers 不支持视图。对于这个 SQL Server After Update Triggers 演示,我们使用下面显示的表。

在这里,我们的任务是在 SQL Server 中为这个 Employee 表创建一个 AFTER UPDATE TRIGGER。通过使用这个 After Update Trigger,我们希望根据 Employee 表上发生的 Update 操作,在 Employee Auditable 中更新/插入记录。

After UPDATE Triggers in SQL Server 1

我们的 Employee Table Audit 也包含相同的 14 条记录,以及 Update Time 和 Action performed NULL 列。

After UPDATE Triggers in SQL Server 2

SQL Server 中的 AFTER UPDATE 触发器示例

在本例中,我们将使用 CREATE TRIGGER 语句在 SQL Server 中为 Employee 表创建 After update Triggers。

请记住,此 After Update Triggers 将在 Employee 表上执行 Update 操作后触发。一旦完成 Employee 表的更新,它将开始在 Employee audit table 中插入/更新。如果 trigger 未能更新 Employee 表,那么它将不会插入到 Audit table 中。

提示:您可以在 SQL Server 中参考TRIGGERS、 AFTER INSERT TRIGGERS 和 AFTER DELETE TRIGGERS 文章。

-- Example for After UPDATE Triggers in SQL Server

CREATE TRIGGER AfterUPDATETrigger on [EmployeeTable]
FOR UPDATE 
AS DECLARE @EmpID INT,
           @EmpName VARCHAR(50),
	   @EmpEducation VARCHAR(50),
	   @EmpOccupation VARCHAR(50),
	   @EmpYearlyIncome DECIMAL (10, 2), 
	   @EmpSales DECIMAL (10, 2), 
	   @ActionPeformed VARCHAR(50);

SELECT @EmpID = ins.ID FROM INSERTED ins;
SELECT @EmpName = ins.Name FROM INSERTED ins;
SELECT @EmpEducation = ins.Education FROM INSERTED ins;
SELECT @EmpOccupation = ins.Occupation FROM INSERTED ins;
SELECT @EmpYearlyIncome = ins.YearlyIncome FROM INSERTED ins;
SELECT @EmpSales = ins.Sales FROM INSERTED ins;
  
IF UPDATE(YearlyIncome)
BEGIN
     SET @ActionPeformed = 'Updated Yearly Income'
END
 
IF UPDATE(Sales)
BEGIN
      SET @ActionPeformed = 'Updated Sales'
END
INSERT INTO [EmployeeTableAudit]( 
       ID
      ,[Name]
      ,[Education]
      ,[Occupation]
      ,[YearlyIncome]
      ,[Sales]
      ,[Update Time]
      ,[ActionPerformed])
VALUES (@EmpID,
        @EmpName,
	@EmpEducation,
	@EmpOccupation,
	@EmpYearlyIncome,
	@EmpSales,
	GETDATE(),
	@ActionPeformed);
PRINT 'We Successfully Fired the AFTER UPDATE Triggers in SQL Server.'
GO
After UPDATE Triggers in SQL Server 3

首先,我们使用 DECLARE 语句声明了所需的变量。

AS DECLARE @EmpID INT,
           @EmpName VARCHAR(50),
	   @EmpEducation VARCHAR(50),
	   @EmpOccupation VARCHAR(50),
	   @EmpYearlyIncome DECIMAL (10, 2), 
	   @EmpSales DECIMAL (10, 2), 
	   @ActionPeformed VARCHAR(50);

接下来,我们使用 SELECT Statement 来选择插入/更新的记录。以下语句将从插入的值中选择一条记录。

SELECT @EmpID = ins.ID FROM INSERTED ins;
SELECT @EmpName = ins.Name FROM INSERTED ins;
SELECT @EmpEducation = ins.Education FROM INSERTED ins;
SELECT @EmpOccupation = ins.Occupation FROM INSERTED ins;
SELECT @EmpYearlyIncome = ins.YearlyIncome FROM INSERTED ins;
SELECT @EmpSales = ins.Sales FROM INSERTED ins;

接下来,我们使用 IF Statement 来检查我们是否正在更新 YearlyIncome 或 Sales。根据操作,我们希望将 @ActionPerformed 列数据更新如下。这些信息可能对审计有帮助。

IF UPDATE(YearlyIncome)
BEGIN
     SET @ActionPeformed = 'Updated Yearly Income'
END
 
IF UPDATE(Sales)
BEGIN
      SET @ActionPeformed = 'Updated Sales'
END

我将通过打开对象资源管理器 -> 转到 SQL Tutorial Database -> 查找并展开 Employee Table -> 然后展开 Triggers Folder 来向您展示新创建的触发器。

After UPDATE Triggers in SQL Server 4

对于 SQL Server After Update Triggers 演示,我们将更新单个列的 Yearly Income,其名称为“Tutorial Gateway”,以检查 After update Trigger 是否被触发。

UPDATE [EmployeeTable]
	SET [YearlyIncome] = 1252565
	WHERE NAME = N'Tutorial Gateway'
After UPDATE Triggers in SQL Server 5

从上面可以看到,我们的 After Update Trigger 被触发了,并且还将一条记录插入到了 Audit Table 中。请使用此查询来检查 Employee 表中更新的记录。

SELECT [ID]
      ,[Name]
      ,[Education]
      ,[Occupation]
      ,[YearlyIncome]
      ,[Sales]
  FROM [EmployeeTable]
After UPDATE Triggers in SQL Server 6

接下来,使用以下查询检查 Employee Table Audit 中的记录。

SELECT [ID]
      ,[Name]
      ,[Education]
      ,[Occupation]
      ,[YearlyIncome]
      ,[Sales]
      ,[ServerName]
      ,[ServerInstanceName]
      ,[Insert Time]
      , [Update Time] 
      ,[ActionPerformed]
  FROM [EmployeeTableAudit]
ORDER BY ID
After UPDATE Triggers in SQL Server 7

从上面的截图可以看到,触发器插入了另一条记录,ID 为 7,具有更新后的信息。

SQL Server 中的 AFTER UPDATE 触发器示例 2

如何使用 SQL Server 中的 After Update Triggers 更新审计表(触发表)中的现有行,而不是插入新记录。在这里,我们将修改我们在上一个示例中创建的触发器。

-- Example for After UPDATE Triggers in SQL Server

CREATE TRIGGER AfterUPDATETrigger on [EmployeeTable]
FOR UPDATE 
AS DECLARE @EmpID INT, 
           @EmpName VARCHAR(50),
           @EmpEducation VARCHAR(50),
	   @EmpOccupation VARCHAR(50),
	   @EmpYearlyIncome DECIMAL (10, 2), 
	   @EmpSales DECIMAL (10, 2), 
	   @ActionPeformed VARCHAR(50);

SELECT @EmpID = ins.ID FROM INSERTED ins;
SELECT @EmpName = ins.Name FROM INSERTED ins;
SELECT @EmpEducation = ins.Education FROM INSERTED ins;
SELECT @EmpOccupation = ins.Occupation FROM INSERTED ins;
SELECT @EmpYearlyIncome = ins.YearlyIncome FROM INSERTED ins;
SELECT @EmpSales = ins.Sales FROM INSERTED ins;
IF UPDATE(YearlyIncome)
BEGIN
     SET @ActionPeformed = 'Updated Yearly Income'
END
IF UPDATE(Sales)
BEGIN
      SET @ActionPeformed = 'Updated Sales'
END
UPDATE [EmployeeTableAudit]
     SET [Name] = @EmpName, 
         [Education] = @EmpEducation, 
	 [Occupation] = @EmpOccupation,
	 [YearlyIncome] = @EmpYearlyIncome, 
	 [Sales] = @EmpSales, 
	 [Update Time] = GETDATE(), 
	 [ActionPerformed] = @ActionPeformed
WHERE ID = @EmpID;
PRINT 'We Successfully Fired the Second AFTER UPDATE Triggers in SQL Server.'
GO

从上面的代码片段中可以看到,我们正在使用 UPDATE Statement 来更新 Audit table 中的现有记录。

接下来,让我更新 Employee 表中多个记录的 Yearly Income。

UPDATE [EmployeeTable]
	SET [YearlyIncome] = 1252565,
	    [Sales] = 699
	WHERE [Occupation] = N'Management' OR
	      [Education] = N'Partial High School'
After UPDATE Triggers in SQL Server 8

从上面的截图可以看到,我们的 SQL Server 中的 after update trigger 已触发。但是,它正在更新单个记录,而不是所有 7 条记录。让我们看看 Employee 表。

After UPDATE Triggers in SQL Server 9

接下来,检查 Employee Audit 表。

After UPDATE Triggers in SQL Server 10

从上面的截图可以看到,触发器更新了其中一条记录。

SQL Server 中的 AFTER UPDATE 触发器示例 3

在本例中,我们将展示如何使用 SQL Server 中的 After update Triggers 将所有记录更新到审计表(触发表)中。在这里,我们将修改上述触发器。

-- Example for After UPDATE Triggers in SQL Server

CREATE TRIGGER AfterUPDATETrigger on [EmployeeTable]
FOR UPDATE 
AS DECLARE @ActionPeformed VARCHAR(50)

IF UPDATE(YearlyIncome)
BEGIN
     SET @ActionPeformed = 'Updated Yearly Income'
END
IF UPDATE(Sales)
BEGIN
      SET @ActionPeformed = 'Updated Sales'
END

INSERT INTO [EmployeeTableAudit]( 
       [ID]
      ,[Name]
      ,[Education]
      ,[Occupation]
      ,[YearlyIncome]
      ,[Sales]
      ,[Update Time]
     ,[ActionPerformed])
SELECT  ID,
	Name,
	Education,
	Occupation,
	YearlyIncome,
	Sales,
	GETDATE(),
	@ActionPeformed
FROM INSERTED;
PRINT 'We Successfully Fired Our Third AFTER UPDATE Triggers in SQL Server.'
GO

从上面的代码可以看到,我们正在使用 INSERT INTO SELECT Statement 来选择插入到 Employee 表中的所有记录。然后我们将这些记录插入到 Audit table 中。

接下来,让我更新 Employee 表中多个记录的 Yearly Income。

UPDATE [EmployeeTable]
	SET [YearlyIncome] = 150000,
	    [Sales] = 888
	WHERE [Occupation] = N'Management'
After UPDATE Triggers in SQL Server 11

正如您所见,我们的 SQL after update trigger 已触发,并将所有记录插入到了 audit table 中。让我们看看 Employee 表。

After UPDATE Triggers in SQL Server 12

接下来,检查 Employee Audit 表。

After UPDATE Triggers in SQL Server 13

从上面的截图可以看到,触发器插入了 4 条新记录,ID 相同(2、7、10 和 12),ID 为 7,具有更新后的信息。这可能不是您需要的结果,所以让我们看看下一个示例。

SQL Server 中的 AFTER UPDATE 触发器示例 4

使用 After Update Triggers 更新审计表(触发表)中的所有记录。为此,我们正在使用 MERGE Statement

-- Example for After UPDATE Triggers in SQL Server

CREATE TRIGGER AfterUPDATETrigger on [EmployeeTable]
FOR UPDATE 
AS DECLARE @ActionPeformed VARCHAR(50)

MERGE [EmployeeTableAudit] AS AuditTab
USING (SELECT * FROM INSERTED) AS Emp
ON AuditTab.ID = emp.ID
WHEN MATCHED THEN
UPDATE SET AuditTab.[Name] = Emp.Name, 
         AuditTab.[Education] = Emp.Education, 
	 AuditTab.[Occupation] = Emp.Occupation,
	 AuditTab.[YearlyIncome] = Emp.YearlyIncome, 
	 AuditTab.[Sales] = Emp.Sales, 
	 AuditTab.[Update Time] = GETDATE(), 
	 AuditTab.[ActionPerformed] = 'Updated Successfully';

PRINT 'We Successfully Fired Our Fourth AFTER UPDATE Triggers in SQL Server.'
GO
After UPDATE Triggers in SQL Server 14

接下来,我将对 Employee 表执行更新。

UPDATE [EmployeeTable]
	SET [YearlyIncome] = 386000,
	    [Sales] = 5525.45
	WHERE [Occupation] = N'Management' OR
	      [Education] = N'Bachelors'
After UPDATE Triggers in SQL Server 15

正如您所见,我们的 update trigger 已触发,并且还更新了 audit table 中的所有记录。让我们看看 Employee 表。

After UPDATE Triggers in SQL Server 16

接下来,检查 Employee Audit 表。

After UPDATE Triggers in SQL Server 17

正如您所见,触发器已更新所有记录。