**导读**
> 作者:杨漆
> 16年关系型数据库管理,从oracle 9i 、10g、11g、12c到Mysql5.5、5.6、5.7、8.0 到TiDB获得3个OCP、2个OCM;运维路上不平坦,跌过不少坑、熬过许多夜。把工作笔记整理出来分享给大伙儿,希望帮到大家少走弯路、少熬夜。
DDL语句能在Oracle数据库的触发器中执行吗 ?
答:对于大多数入门级的DBA通常给出的答案是否定的。
而对于大师级的数据库专家,可以给出解决方案如下:
在触发器中加入自治事务处理,即:pragma autonomous_transaction便可完成此项功能需求。
举例如下:
Step 1.创建自治事务的存储过程proce1,执行三类DDL(根据业务需求可选其中一种或多种,不必全选)
set serveroutput on;
Create or Replace Procedure proce1
is
pragma AUTONOMOUS_TRANSACTION;
BEGIN
dbms_output.put_line(' How to execute DDL in trigger?');
execute immediate 'drop table tab_a';
execute immediate 'create table tab_a as select clumn_a, clumn_b, clumn_c from tab_b';
execute immediate 'truncate table tab_b';
dbms_output.put_line('It is So Easy !');
END;
/
Procedure created.
Step 2.创建触发器,并调用恰才新生成的存储过程proce1即可。(此处只举例了事后触发器,根据业务需求可自由编写其它类型的触发器,原理一样)
create or replace trigger test_trigger1 after delete on emp
BEGIN
proce1;
END;
/
至此,在Oracle数据库的触发器中执行DDL是不是可以做到,并且很容易?
答:It’s So Easy !!!
封装Commit过程与此类同,不再赘述。有兴趣的小伙伴可自行实验。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。