【问题标题】:SQL Trigger to check if a value exist on another table after insertSQL触发器检查插入后另一个表上是否存在值
【发布时间】: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


【解决方案1】:

您的问题不清楚。 这些部分组合起来毫无意义:

join table3 on i.tId=table3.tId 
where i.tId NOT IN (SELECT tId from table3)

-> 没有匹配的行!

检查两个表之间没有依赖关系的简单解决方案:

CREATE TRIGGER trigger1
    ON table1 AFTER INSERT     
AS 
BEGIN
    IF (EXISTS (SELECT Id FROM table2 WHERE Id IN(SELECT tId FROM Inserted))
        OR EXISTS (SELECT Id FROM table3 WHERE Id IN(SELECT tId FROM Inserted))) BEGIN
        ROLLBACK;
    END
END

【讨论】:

  • 谢谢@7schmiede。但是您的解决方案也没有做到这一点。非法表中的行仍然允许插入合法表中。
  • 哪个表是合法的,哪个是非法的?请把你的 3 张表和意图描述得更近一点,然后我会修改查询。
猜你喜欢
  • 2013-08-12
  • 1970-01-01
  • 2018-07-25
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
相关资源
最近更新 更多