暂无图片
触发器记录历史DDL语句
我来答
分享
Thomas
2022-08-08
触发器记录历史DDL语句

如题,ORACLE, 想搞个触发器,把所有DDL记录下来。请给个思路,谢谢。

我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
农夫三拳

创建oracle ddl触发器记录所有ddl操作

---- 存储DDL语句的表
create table sys.my_audit_ddl
(
opertime timestamp PRIMARY KEY,
ip varchar2(20),
hostname varchar2(30),
operation varchar2(30),
object_type varchar2(30),
object_name varchar2(30),
sql_stmt clob,
db_schema varchar2(30)
);

---- 捕获DDL语句的触发器
CREATE OR REPLACE TRIGGER sys.trg_my_audit_ddl
after ddl ON DATABASE
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
n NUMBER;
stmt clob := NULL;
sql_text ora_name_list_t;
BEGIN
n := ora_sql_txt(sql_text);
FOR i IN 1 .. n LOOP
stmt := stmt || sql_text(i);
END LOOP;

INSERT INTO sys.my_audit_ddl
(opertime, ip, hostname, operation, object_type, object_name, sql_stmt,db_schema)
VALUES
(systimestamp,
sys_context('userenv', 'ip_address'),
sys_context('userenv', 'terminal'),
ora_sysevent,
ora_dict_obj_type,
ora_dict_obj_name,
stmt,
user
);

COMMIT;
END;
/

-- drop procedure test_proc;
CREATE OR REPLACE PROCEDURE test_proc AS
BEGIN
dbms_output.put_line('这是一个测试中文DDL过程');
END;
/

CREATE OR REPLACE PROCEDURE test_proc AS
BEGIN
dbms_output.put_line('这是一个测试中文DDL过程');
END;
/

-----查看结果----
select * from sys.my_audit_ddl;

暂无图片 评论
暂无图片 有用 2
暂无图片
吾喾
暂无图片 评论
暂无图片 有用 0
PiscesCanon

alter system set enable_ddl_logging=true scope=both sid='*';

这个参数设置为true可以把ddl操作记录到警告日志中。


如下:



此时警告日志:


暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏