sql server触发器:删除后从表中删除

xmjla07d  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(340)

我有一个父表叫做 announcement 这样地

create table announcement 
(
    aid int primary key, 
    name varchar,
    ......
)

还有一张table cars 继承自 announcement (tpt)像这样

create table cars
(
     aid int primary key 
             foreign key references announcement(aid) on delete cascade,
     .....
)

我知道如果我从 announcement ,将从中删除该记录 cars 也因为“删除级联”。
但我想确定如果 cars 已经发生的情况下,该行也将从中删除 announcement .
我写了一个触发器,从这个问题中学到的是:

create trigger delCarFromA 
on car
after delete 
as
begin 
    delete from announcement 
    where announc.aid = car.aid;
end;

但我有个错误:
无法绑定多部分标识符“car.aid”。
我该怎么办?

9fkzdhlc

9fkzdhlc1#

请尝试下面的代码,

CREATE TRIGGER delCarFromA on cars
    FOR DELETE
AS
    DELETE FROM dbo.announc
    WHERE aid IN(SELECT deleted.aid FROM deleted)
GO

祝你工作顺利!

8fq7wneg

8fq7wneg2#

你的table是1:n的。一 announcement 可以有很多车,一辆车可以有一辆 announcement . 如果删除 announcement 你删除了所有的车。但是另一个方向需要一个规则,例如。
如果有 car 被删除,它的 announcement 所有其他的车都必须删除。

如果 announcement 的最后一个 car 删除(即 announcement 没有车)然后 announcement 必须删除。
我想你想要第二条规则。理想情况下,触发器应该是after语句触发器,但sqlserver不支持这种情况。与sql标准中定义的不同,sqlserver中的每个触发器都是一个 FOR EACH ROW 隐式触发。
在一个 FOR EACH ROW 触发您可以访问已删除的汽车行。但这不是通过 car.aid ,但与 (select aid from deleted) 在sql server中。
如果你想应用第二条规则,就像我假设的,你还需要一个 EXISTS 子句来查看 announcement 还有车。

create trigger delCarFromA on car
after delete
as
begin 
  delete from announcement a
  where aid = (select aid from deleted)
  and not exists
  (
    select null
    from car c
    where c.aid = a.aid
  );
end;

如果要删除 announcemmnt 即使它还有车,那就把车拆了 EXISTS 触发器的子句。

相关问题