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,因此您需要指定它。
我正在做一个在视图上执行 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,因此您需要指定它。