ORACLE SQL- 在 parent table 上删除触发器后级联设置为空,突变错误解决方法
ORACLE SQL- After delete trigger on parent table with cascade set null, mutating error workaround
我正在尝试使用函数 [=] 在 parent table cars
上删除后更新 child table service
中的列17=] 在 cars
和 service
tables.
上使用了一些 selects
这是我的 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;
...
它被触发但抛出 'mutating error' 因为函数 choose_ideal_car
使用来自两个 table 的 select。也许这个解决方案是在我的 choose_ideal_car
函数中创建我的 cars
table 和 select 的副本,而不是从 [=16] 中创建 selecting =] table 我的触发器定义在哪个上面,但这对我来说听起来不太好。
当我写这篇文章时 post 我意识到即使我的第一个触发器被触发它也不会正常工作并抛出相同的 'mutating error'.
所以最后我有两个问题:
1) 为什么第一个触发器从未触发?
2) 如何修复此变异错误并使所有功能正常工作?
where car_id = null
returns 没有行,使用 where car_id is null
代替
我正在尝试使用函数 [=] 在 parent table cars
上删除后更新 child table service
中的列17=] 在 cars
和 service
tables.
这是我的 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;
...
它被触发但抛出 'mutating error' 因为函数 choose_ideal_car
使用来自两个 table 的 select。也许这个解决方案是在我的 choose_ideal_car
函数中创建我的 cars
table 和 select 的副本,而不是从 [=16] 中创建 selecting =] table 我的触发器定义在哪个上面,但这对我来说听起来不太好。
当我写这篇文章时 post 我意识到即使我的第一个触发器被触发它也不会正常工作并抛出相同的 'mutating error'.
所以最后我有两个问题:
1) 为什么第一个触发器从未触发?
2) 如何修复此变异错误并使所有功能正常工作?
where car_id = null
returns 没有行,使用 where car_id is null
代替