在SQL中对视图触发DML操作

时间:2018-05-18 23:29:53

标签: sql oracle plsql triggers dml

我正在做一个在视图上执行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)

如何进行UPDATE触发?我成功地触发了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;

1 个答案:

答案 0 :(得分:1)

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,所以你需要指定它。