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')
);
我有 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')
);