触发器的替代方案

在 SQL Server 中构建与优化触发器

Florin Angelescu

Instructor

触发器 vs. 存储过程

触发器

  • 由事件自动触发
-- 将触发 INSERT 触发器
INSERT INTO Orders [...];
  • 不支持参数或事务
  • 不能返回输出值

存储过程

  • 仅在显式调用时运行
-- 将运行存储过程
EXECUTE sp_DailyMaintenance;
  • 接受输入参数和事务
  • 可返回输出值
在 SQL Server 中构建与优化触发器

触发器 vs. 存储过程

触发器

用于:

  • 审计
  • 约束/完整性 enforcement

存储过程

用于:

  • 通用任务
  • 用户特定需求
在 SQL Server 中构建与优化触发器

触发器 vs. 计算列

触发器

  • 计算列值
  • 计算可使用其他表的列
  • INSERTUPDATE 进行计算
    -- 在触发器体中使用
    [...]
    UPDATE
    SET TotalAmount = Price * Quantity
    [...]
    

计算列

  • 计算列值
  • 计算仅使用同一表的列
  • 在建表时定义计算
    -- 列定义
    [...]
    TotalAmount AS Price * Quantity
    [...]
    
在 SQL Server 中构建与优化触发器

计算列表达式示例

CREATE TABLE [SalesWithPrice]
(
    [OrderID] INT IDENTITY(1,1),
    [Customer] NVARCHAR(50),
    [Product] NVARCHAR(50),
    [Price] DECIMAL(10,2),
    [Currency] NVARCHAR(3),
    [Quantity] INT,
    [OrderDate] DATE DEFAULT (GETDATE()),
    [TotalAmount] AS [Quantity] * [Price]
);
在 SQL Server 中构建与优化触发器

用触发器实现计算列

CREATE TRIGGER [SalesCalculateTotalAmount]
ON [SalesWithoutPrice]
AFTER INSERT
AS
    UPDATE [sp]
    SET [sp].[TotalAmount] = [sp].[Quantity] * [p].[Price]
    FROM [SalesWithoutPrice] AS [sp]
    INNER JOIN [Products] AS [p] ON [sp].Product = [p].[Product]
    WHERE [sp].[TotalAmount] IS NULL;
在 SQL Server 中构建与优化触发器

让我们实际对比一下!

在 SQL Server 中构建与优化触发器

Preparing Video For Download...