标记应在触发前或触发后使用
Tagging should use before trigger or after trigger
我有一列 STag
,数据类型为 bit
,另一列 SFile
的数据类型为 VARBINARY(MAX)
。
当 Web 应用程序调用更新此 table 时,我的触发器应在 SFile
有数据时更新 STag = 1
,相反,在 [=13= 时更新 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
?
编写触发器
为什么还要用触发器呢??您可以轻松创建一个计算列,其中包含该信息并且无需手动干预即可保留"up to date":
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
(真) - 否则 0
(假)。
没有混乱的触发器,无需不断更新 - SQL 服务器会自动在幕后为您处理这一切
我有一列 STag
,数据类型为 bit
,另一列 SFile
的数据类型为 VARBINARY(MAX)
。
当 Web 应用程序调用更新此 table 时,我的触发器应在 SFile
有数据时更新 STag = 1
,相反,在 [=13= 时更新 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
?
为什么还要用触发器呢??您可以轻松创建一个计算列,其中包含该信息并且无需手动干预即可保留"up to date":
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
(真) - 否则 0
(假)。
没有混乱的触发器,无需不断更新 - SQL 服务器会自动在幕后为您处理这一切