SQL 删除触发器

SQL delete trigger

我有 3 个 table:

POS(IDPOS, IDCARD);

卡片(IDCARD,IDPERSON);

人(IDPERSON,PERSONTYPE)。

每次将卡关联到 POS 时,我需要确保拥有该卡的人只能是 PERSONTYPE='Employee' 或 PERSONTYPE='Volunteer'。 这是我到目前为止所完成的,但是当我插入有效记录时它似乎不起作用。

DELETE POS
FROM inserted i 
INNER JOIN POS p ON i.IDPOS=p.IDPOS
INNER JOIN CARDS ON i.IDCARD=CARDS.IDCARD
INNER JOIN PERSON ON CARDS.IDPERSON=PERSON.IDPERSON
WHERE PERSONTYPE <> 'Employee' or PERSONTYPE <> 'Volunteer';

此触发器在 POS table 上完成,并且是插入后更新。

有人知道错了吗?

使用NOT IN:

WHERE PERSONTYPE NOT IN ('Employee', 'Volunteer');

您的逻辑需要 AND,而不是 OR

我相信你已经为POS使用了别名,你需要输入别名才能删除。您也可以使用 NOT EXISTS() 而不是加入另一个 table :

使用别名:

DELETE P
FROM POS AS P 
INNER JOIN INSERTED AS I ON i.IDPOS=p.IDPOS
INNER JOIN CARDS ON I.IDCARD=CARDS.IDCARD
WHERE NOT EXISTS (SELECT 1 
                    FROM PERSON 
                    WHERE CARDS.IDPERSON=PERSON.IDPERSON 
                    AND PERSONTYPE IN ('Employee','Volunteer')
                 );

正常使用:

DELETE 
FROM POS
INNER JOIN INSERTED AS I ON I.IDPOS=POS.IDPOS
INNER JOIN CARDS ON I.IDCARD=CARDS.IDCARD
WHERE  NOT EXISTS (SELECT 1 
                    FROM PERSON 
                    WHERE CARDS.IDPERSON=PERSON.IDPERSON 
                    AND PERSONTYPE IN ('Employee','Volunteer')
                 );