我正在做一个在视图上执行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;
答案 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,所以你需要指定它。