注册
-6521: 当前触发器不支持DDL语句及-6517: 试图在触发器中执行提交或回滚操作的报错处理
技术分享/ 文章详情 /

-6521: 当前触发器不支持DDL语句及-6517: 试图在触发器中执行提交或回滚操作的报错处理

伯乐就是你自己 2023/01/09 1638 2 0

需求是在表级触发器中使用DDL语句。
测试代码块如下
create table tab_before(id int, name varchar(20));
insert into tab_before values(1,‘aaa’);
create table tab_before_result (type varchar(20),num int);
CREATE SEQUENCE seq_1 INCREMENT BY 1 START WITH 1 MINVALUE 1;
create or replace trigger trigger_before
before insert on tab_before
begin
insert into tab_before_result select ‘before’,count(*) from tab_before;
execute immediate ‘drop SEQUENCE seq_1’;
end;
/
insert into tab_before values(7,‘bbb’);
执行最后的insert时报错:-6521: 当前触发器不支持DDL语句
解决方式在dm.ini文件中添加隐藏参数DDL_TV_TRIGGER=1并重启数据库
image.png

对于上面的代码块执行最后一行时会产生新的报错:-6517: 试图在触发器中执行提交或回滚操作

因此可以考虑使用存储过程中使用自治事务的方式绕过此问题。修改后的代码块如下:
CREATE SEQUENCE seq_1 INCREMENT BY 1 START WITH 1 MINVALUE 1;
create table tab_before(id int, name varchar(20));
insert into tab_before values(1,‘aaa’);
create table tab_before_result (type varchar(20),num int);

CREATE or replace PROCEDURE drop_seq
AS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
execute immediate ‘drop SEQUENCE seq_1’;
END;

create or replace trigger trigger_before
before insert on tab_before
begin
insert into tab_before_result select ‘before’,count(*) from tab_before;
drop_seq();
end;
/

insert into tab_before values(7,‘bbb’);

核心点有两个:1. DDL_TV_TRIGGER=1
2.触发器调用存储过程,存储过程使用自治事务。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服