SQL 中视图的 DML 操作触发器

Trigger fo DML operations on view in SQL

我正在做一个在视图上执行 DML 操作的触发器。有两个示例表:

Vehicle: vehicle_id, size, brand_id

Brand: brand_id, name

我创建了一个视图:

CREATE OR REPLACE VIEW vehicle_view AS
SELECT vehicle_id, size, brand.name FROM Vehicle
JOIN Brand USING (brand_id)

如何执行更新触发器?我成功触发了 INSERT,但找不到创建 UPDATE 触发器的方法。

CREATE OR REPLACE TRIGGER tr_vehicle_update
INSTEAD OF INSERT OR UPDATE ON vehicle_view
BEGIN
  UPDATE Vehicle SET
    vehicle_id = :new.vehicle_id
    WHERE size = :new.size; 
  UPDATE Brand SET
    brand_id = :new.brand_id
    WHERE name = :new.name; 
END;

BRAND_ID 是连接两个表的外键。所以你真的,真的不想改变它。 VEHICLE_ID 是 VEHICLE 的主键,因此您也不想更改它。

大概你的逻辑应该是这样的:

CREATE OR REPLACE TRIGGER tr_vehicle_update
INSTEAD OF INSERT OR UPDATE ON vehicle_view
for each row
BEGIN
  if updating then
    if :new.size != :old.size then
       UPDATE Vehicle SET size = :new.size
       WHERE vehicle_id = :new.vehicle_id;
    end if;
    if  :new.name != :old.name then
       UPDATE Brand SET name = :new.name
       WHERE brand_id = :new.brand_id; 
    end if;
  end if;
  -- put your IF INSERTING logic here
END;

请注意,INSTEAD OF 触发器只能是 FOR EACH ROW,因此您需要指定它。