Oracle APEX中实现教师表删除时同步删除顾问表的触发器问题
修正后的Oracle触发器实现
原触发器存在几个明显问题,以下是错误点说明和修正后的代码:
错误点分析
- 表名不匹配:你的实际表是
teachers和advisers,触发器里写的TEACHER、ADVISER属于笔误,需与实际表名严格一致(Oracle中若建表时用小写,需加双引号,否则默认大写)。 - 被删除行引用错误:行级触发器中,不能直接通过表名获取被删除的主键值,必须使用
:OLD伪记录访问删除前的字段值。 - 冗余的自治事务:
pragma autonomous_transaction会让触发器在独立事务中执行,导致主事务回滚时,触发器的删除操作已提交,造成数据不一致,此处完全不需要该声明。 - 字段名不匹配:你明确说明
teachers的主键是Teachers_id且为advisers的外键,但原触发器用了T_id,需对应实际外键字段名。
修正后的触发器代码
如果advisers的外键字段就是Teachers_id:
create or replace TRIGGER delete_teacher AFTER DELETE ON teachers FOR EACH ROW BEGIN DELETE FROM advisers WHERE advisers.Teachers_id = :OLD.Teachers_id; END; /
如果advisers的外键字段实际是T_id(比如你给外键起了别名),则代码调整为:
create or replace TRIGGER delete_teacher AFTER DELETE ON teachers FOR EACH ROW BEGIN DELETE FROM advisers WHERE advisers.T_id = :OLD.Teachers_id; END; /
额外说明
- 若你的表是用小写字母创建的(例如
create table teachers(...)),则触发器中的表名需要用双引号包裹,比如"teachers"和"advisers"。 - 去掉自治事务后,触发器的删除操作会和主表的删除操作处于同一事务中,确保数据一致性:如果主删除操作回滚,触发器的删除操作也会同步回滚。
内容的提问来源于stack exchange,提问作者Djdj
相关产品推荐
相关产品推荐

