暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

怎样在触发器trigger中执行DDL和commit

原创 John2020 2021-06-14
964

导读

作者:杨漆
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过程与此类同,不再赘述。有兴趣的小伙伴可自行实验。123凡科快图.gif

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论