【发布时间】:2017-03-27 00:08:45
【问题描述】:
我正在尝试创建一个触发器,该触发器将为正在更新的行填充一列。这是我所做的,但它不起作用:
CREATE TRIGGER PSL_Cases_Address
ON dbo.PSL_Cases
AFTER INSERT, UPDATE
AS
BEGIN
IF UPDATE(Permit_No) /*If column not affected skip*/
BEGIN
UPDATE psl_cases
SET address = (
SELECT TOP 1 permits.address
FROM permits
LEFT OUTER JOIN PSL_Cases ON PSL_Cases.Permit_No=Permits.PermitsID
WHERE PSL_Cases.PSL_CasesID=PSL_CasesID
)
WHERE dbo.PSL_Cases.PSL_CasesID = PSL_CasesID;
END
END;
任何想法我可能做错了什么?
【问题讨论】:
-
当 order by 不存在时,您将不会得到想要的结果..使用 order by 使其具有确定性
-
对于任何更新或插入语句,都会调用一次 SQL Server 触发器,并且会为您填充表 inserted 和 updated。这与例如 Firebird 不同,在 Firebird 中,每条更新或插入的记录都会调用一次触发代码。您的 SQL Server 触发器代码必须经过精心设计,才能与 inserted 和 updated 表一起使用。
-
@nolaspeaker:伪表是 Inserted 和 Deleted - 没有 Updated ...
-
inserted和deleted虚拟表的参考:Use the inserted and deleted Tables。
标签: sql-server tsql sql-server-2012 database-trigger