我在 Oracle Express 11g 上。我正在尝试创建此触发器:
CREATE TRIGGER remove_useless_surveys
BEFORE UPDATE OF agent_id, agency_id, province_id ON surveys
FOR EACH ROW WHEN (
new.agent_id IS NULL AND
new.agency_id IS NULL AND
new.province_id IS NULL)
DELETE FROM surveys WHERE survey_code = :new.survey_code
agent_id、agency_id 和province_id 是外键,带有ON DELETE SET NULL 子句。
当所有三个外键都设置为 NULL 时,我需要在调查表中删除一行(因为删除了引用的行)。
触发器编译没有问题,但是当条件触发时,我得到这个错误:
SQL 错误:ORA-04091:表 REALESTATE.SURVEYS 正在变异,
触发器/函数可能看不到它 ORA-06512:在
“REALESTATE.REMOVE_USELESS_SURVEYS”,第 1 行 ORA-04088:
执行触发器 'REALESTATE.REMOVE_USELESS_SURVEYS'
04091 期间出错。 00000 - “表 %s.%s 正在发生变化,触发器/函数可能看不到它”
*原因:触发器(或此语句中引用的用户定义的 plsql 函数
)试图查看(或修改)一个表正在
被触发它的语句修改。
*操作:重写触发器(或函数),使其不读取该表。
实际上,我知道我正在编辑触发触发器的同一张表。但是我想取消更新,或者敲定它,我不在乎,然后删除那一行。
你能帮助我吗?我怎样才能实现我想要做的事情?