【发布时间】:2018-06-29 11:33:42
【问题描述】:
我一直在尝试使触发器起作用。我的目标是在插入表时触发检查另一个表上是否存在值。 以下是不起作用的触发器:
CREATE TRIGGER trigger1
ON table1
AFTER INSERT
AS
declare @tId int
IF EXISTS ((Select @tId from inserted i join table2 on i.tId=table2.Id
join table3 on i.tId=table3.tId
where i.tId NOT IN (SELECT tId from table3)
and table2.ApplicationDate > '2018-01-31 00:00:00.0000000'
and table2.cnumber is NOT NULL))
BEGIN
ROLLBACK transaction
SET NOCOUNT ON;
END
GO
谁能指点我正确的方向。
【问题讨论】:
-
你能详细说明到底是什么不起作用吗?
-
默默回滚可能会在未来造成混乱……
-
Select @tId是可疑的,可能不是您想要的,它为您提供所有行的NULL。由于您使用的是EXISTS,所以在这里使用什么并不重要(SELECT 0也可以),但这表明您不清楚事物的语义。无论如何,@tId在这里应该有什么好处? -
我可能错了,但这感觉可以通过正确使用外键约束来处理。
-
好的@Murenik 从触发器中,子查询应该有一些值。现在,如果插入值中的 tId 存在于子查询结果中,则应该回滚表上插入的行。但是,当应用触发器时,不会回滚行。所有行都被提交。
标签: sql-server tsql database-trigger