【发布时间】:2015-05-05 12:48:35
【问题描述】:
在删除父表 cars 后,我正在尝试更新子表 service 中的列,使用函数 choose_ideal_car 对 cars 和 service 表使用一些选择。
这是我的 sql 脚本的一部分:
CREATE TABLE cars(car_id INT CONSTRAINT pk_id_cars);
CREATE TABLE service(
service_id INT CONSTRAINT pk_id_service PRIMARY KEY,
car_id INT CONSTRAINT fk_id_car REFERENCES cars(car_id) ON DELETE SET NULL,
period VARCHAR2(5) CONSTRAINT check_period CHECK period IN ('even','odd','every'),
period VARCHAR2(3) CONSTRAINT check_day CHECK day IN ('mon','tue','wed','thu','fri')
);
CREATE OR REPLACE TRIGGER service_set_car_id AFTER DELETE ON cars
DECLARE
CURSOR touched_rows is select * from service where car_id = null;
touched_row service%ROWTYPE;
BEGIN
OPEN touched_rows;
LOOP
FETCH touched_rows INTO touched_row;
EXIT WHEN touched_rows%NOTFOUND;
UPDATE service SET car_id = choose_ideal_car(touched_row.period,touched_row.day) WHERE service_id = touched_row.service_id;
END LOOP;
CLOSE touched_rows;
end;
/
由于某种原因,我的触发器从未被触发。
我也尝试过创建这样的触发器:
CREATE OR REPLACE TRIGGER service_set_car_id AFTER DELETE FROM cars FOR EACH ROW
CURSOR touched_rows is select * from service where car_id = :old.car_id;
...
因为函数choose_ideal_car 使用两个表中的选择而被触发但抛出“变异错误”。也许解决方案是创建我的cars 表的副本并在我的choose_ideal_car 函数中从中进行选择,而不是从我的触发器定义的cars 表中进行选择,但这对我来说听起来并不好。
在我写这篇文章时,我意识到即使我的第一个触发器被触发,它也无法正常工作并引发相同的“变异错误”。
所以最后我有两个问题:
1) 为什么第一个触发器从未触发?
2) 如何修复这个变异错误并让所有工作正常?
【问题讨论】: