【问题标题】:Tagging should use before trigger or after trigger标记应在触发前或触发后使用
【发布时间】:2020-05-18 04:11:43
【问题描述】:

我有一列STag,数据类型为bit,另一列SFile 的数据类型为VARBINARY(MAX)

当 web 应用程序调用更新此表时,我的触发器将在 SFile 有数据时更新 STag = 1,反之,当 SFile 清空时更新 STag = 0

    CREATE TRIGGER [STag_UPDATE] 
    ON [Employee] 
    AFTER UPDATE
    AS
        DECLARE @EMPLOYEEID AS INT;
    BEGIN
        SET NOCOUNT ON;

        SELECT @EMPLOYEEID = EmployeeId 
        FROM inserted

        UPDATE EMPLOYEE 
        SET STag = CASE 
                       WHEN LEN(SFile) > 0 THEN 1
                       ELSE 0
                    END
        WHERE EmployeeId = @EMPLOYEEID
    END
    GO

    ALTER TABLE [dbo].[Employee] ENABLE TRIGGER [STag_UPDATE]
    GO

我的问题是:以这种方式编写触发器是否合适?或者我将使用instead of 编写触发器?

【问题讨论】:

  • 您犯了经典的触发器 101 错误 - 假设 inserted 只会保存一条记录,而实际上它可能包含 0-N 条记录。
  • @DaleK 你能解释更多吗?我是 mssql 触发器的新手。
  • official docs 应该始终是您的第一个停靠港。
  • 是否使用AFTER 触发器或INSTEAD OF 触发器是一个设计决策,只有您可以做出 - instead of 触发器要求您处理整个更新,所以请记住这一点.但在您的情况下,after 触发器将导致需要处理的无限递归循环。
  • 我会让你的应用程序的更新方法调用一个存储过程来计算SLTag,然后在你的表上执行一个更新语句而不需要触发器。或者我会按照以下 marc_s 的说明进行操作!

标签: sql-server triggers sql-update database-trigger dml


【解决方案1】:

为什么还要麻烦触发器?您可以轻松创建包含该信息且无需人工干预即可保持“最新”的计算列

ALTER TABLE dbo.Employee
ADD IsEmpty AS CASE WHEN DATALENGTH(SLFile) = 0 THEN 1 WHEN SLFile IS NULL THEN 1 ELSE 0 END PERSISTED

因此,如果 SLFile 为 NULL 或 DATALENGTH 为 0 - 那么 IsEmpty 将显示值 1 (true) - 否则 0 (false)。

没有混乱的触发器,无需不断更新 - SQL Server 会在幕后自动为您处理一切

【讨论】:

    猜你喜欢
    • 2021-08-06
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 2020-07-06
    相关资源
    最近更新 更多