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 中更新/插入记录。

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

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

首先,我们使用 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 来向您展示新创建的触发器。

对于 SQL Server After Update Triggers 演示,我们将更新单个列的 Yearly Income,其名称为“Tutorial Gateway”,以检查 After update Trigger 是否被触发。
UPDATE [EmployeeTable] SET [YearlyIncome] = 1252565 WHERE NAME = N'Tutorial Gateway'

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

接下来,使用以下查询检查 Employee Table Audit 中的记录。
SELECT [ID]
,[Name]
,[Education]
,[Occupation]
,[YearlyIncome]
,[Sales]
,[ServerName]
,[ServerInstanceName]
,[Insert Time]
, [Update Time]
,[ActionPerformed]
FROM [EmployeeTableAudit]
ORDER BY ID

从上面的截图可以看到,触发器插入了另一条记录,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'

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

接下来,检查 Employee Audit 表。

从上面的截图可以看到,触发器更新了其中一条记录。
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'

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

接下来,检查 Employee Audit 表。

从上面的截图可以看到,触发器插入了 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

接下来,我将对 Employee 表执行更新。
UPDATE [EmployeeTable] SET [YearlyIncome] = 386000, [Sales] = 5525.45 WHERE [Occupation] = N'Management' OR [Education] = N'Bachelors'

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

接下来,检查 Employee Audit 表。

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