【发布时间】: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