需求是在表级触发器中使用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并重启数据库
对于上面的代码块执行最后一行时会产生新的报错:-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.触发器调用存储过程,存储过程使用自治事务。
文章
阅读量
获赞