触发器不能用alter让关联主键失效吗

billlyh 2013-08-10 02:02:14
单独在pl/sql运行语句就可以:
DECLARE
BEGIN
EXECUTE IMMEDIATE 'alter table bale_info disable primary key cascade';
EXECUTE IMMEDIATE 'alter table bale_info ENABLE primary KEY';
END;
但是写在触发器里,当触发时就报错:
ora-04092:cannot commit in a trigger

触发器:
CREATE OR REPLACE TRIGGER tri_del_type
BEFORE DELETE
ON bale_type_info
FOR EACH ROW
DECLARE
BEGIN
EXECUTE IMMEDIATE 'alter table bale_info disable primary key cascade';
DELETE FROM bale_info t WHERE t.type_id=:old.type_id;
EXECUTE IMMEDIATE 'alter table bale_info ENABLE primary KEY';
END;

...全文
198 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
billlyh 2013-08-15
  • 打赏
  • 举报
回复
引用 2 楼 yinan9 的回复:
一般情况下,触发器中是无法处理DDL语句的。但是可以使用自治事务来实现 可以在触发器中加入:pragma autonomous_transaction; 表示自由事务处理。 试试下面的语句。

CREATE OR REPLACE TRIGGER tri_del_type
BEFORE DELETE
ON bale_type_info
FOR EACH ROW  
DECLARE
  pragma autonomous_transaction;
BEGIN
   EXECUTE IMMEDIATE 'alter table bale_info disable primary key cascade';
    DELETE FROM bale_info t WHERE t.type_id=:old.type_id;
  EXECUTE IMMEDIATE 'alter table bale_info ENABLE primary KEY';
END;
加入这个语句,报错 ora-04031
yinan9 2013-08-15
  • 打赏
  • 举报
回复
一般情况下,触发器中是无法处理DDL语句的。但是可以使用自治事务来实现 可以在触发器中加入:pragma autonomous_transaction; 表示自由事务处理。 试试下面的语句。

CREATE OR REPLACE TRIGGER tri_del_type
BEFORE DELETE
ON bale_type_info
FOR EACH ROW  
DECLARE
  pragma autonomous_transaction;
BEGIN
   EXECUTE IMMEDIATE 'alter table bale_info disable primary key cascade';
    DELETE FROM bale_info t WHERE t.type_id=:old.type_id;
  EXECUTE IMMEDIATE 'alter table bale_info ENABLE primary KEY';
END;
公寓城传说 2013-08-15
  • 打赏
  • 举报
回复
删除之前 让主键失效 在创建主键。。路过看看
billlyh 2013-08-15
  • 打赏
  • 举报
回复
yinan9 你的方案是对的,确实用自治事务之后,就能使用DDL语句了
billlyh 2013-08-15
  • 打赏
  • 举报
回复
引用 2 楼 yinan9 的回复:
一般情况下,触发器中是无法处理DDL语句的。但是可以使用自治事务来实现 可以在触发器中加入:pragma autonomous_transaction; 表示自由事务处理。 试试下面的语句。

CREATE OR REPLACE TRIGGER tri_del_type
BEFORE DELETE
ON bale_type_info
FOR EACH ROW  
DECLARE
  pragma autonomous_transaction;
BEGIN
   EXECUTE IMMEDIATE 'alter table bale_info disable primary key cascade';
    DELETE FROM bale_info t WHERE t.type_id=:old.type_id;
  EXECUTE IMMEDIATE 'alter table bale_info ENABLE primary KEY';
END;
ora-04031 问题解决了,把触发器删除,重新建之后运行,就没报这个错

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧