if for whatever reason, you are required to log DDL, for example, I need to know why the LAST_DDL_TIME of a table was getting updated, you can do this from Oracle 11g.
to Enable
SQL> show parameter ENABLE_DDL_LOGGING
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
enable_ddl_logging boolean FALSE
SQL> ALTER SYSTEM SET ENABLE_DDL_LOGGING=TRUE;
System altered.
SQL> show parameter ENABLE_DDL_LOGGING
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
enable_ddl_logging boolean TRUE
to Disable
SQL> show parameter ENABLE_DDL_LOGGING
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
enable_ddl_logging boolean TRUE
SQL> ALTER SYSTEM SET ENABLE_DDL_LOGGING=FASLE;
System altered.
SQL> show parameter ENABLE_DDL_LOGGING
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
enable_ddl_logging boolean FALSE
SQL> create view cheny as select * from dual;
View created.
SQL> select * from cheny;
D
-
X
SQL> drop view cheny;
View dropped.
Now if you look in the following text file:
$ADR_BASE/diag/rdbms/${DBNAME}/${ORACLE_SID}/log/ddl_${ORACLE_SID}.log
You will see:
(Some DDL statements are written to a text file in the ADR home)
Mon Sep 11 15:52:59 2020
diag_adl:create view cheny as select * from dual
diag_adl:drop view cheny
There is also a XML version:
$ADR_BASE/diag/rdbms/${DBNAME}/${ORACLE_SID}/log/ddl/log.xml
(Some DDL statements are written to an XML file in the ADR home)
create view cheny as select * from dual
drop view cheny
DDL statements are written to the alert log in: $ADR_BASE/diag/rdbms/${DBNAME}/${ORACLE_SID}/trace/alert_${ORACLE_SID}.log
Oracle Database Lifecycle Management Pack for Oracle Database
“Licensed Parameters
The init.ora parameter ENABLE_DDL_LOGGING is licensed as part of the Database Lifecycle Management Pack when set to TRUE. When set to TRUE, the database reports schema changes in real time into the database alert log under the message group schema_ddl. The default setting is FALSE.”
Database Reference: ENABLE_DDL_LOGGING
See MOS Note:
How To Enable DDL Logging in Database (Doc ID 2207341.1)
“When ENABLE_DDL_LOGGING is set to true, the following DDL statements are written to the alert log:
ALTER/CREATE/DROP/TRUNCATE CLUSTER
ALTER/CREATE/DROP FUNCTION
ALTER/CREATE/DROP INDEX
ALTER/CREATE/DROP OUTLINE
ALTER/CREATE/DROP PACKAGE
ALTER/CREATE/DROP PACKAGE BODY
ALTER/CREATE/DROP PROCEDURE
ALTER/CREATE/DROP PROFILE
ALTER/CREATE/DROP SEQUENCE
CREATE/DROP SYNONYM
ALTER/CREATE/DROP/RENAME/TRUNCATE TABLE
ALTER/CREATE/DROP TRIGGER
ALTER/CREATE/DROP TYPE
ALTER/CREATE/DROP TYPE BODY
DROP USER
ALTER/CREATE/DROP VIEW
Earlier, RENAME was not logged and a bug was reported for that and the same is fixed in 11.2.0.4.
Document 12938609.8 – ENABLE_DDL_LOGGING does not log RENAME table statements, this is fixed in 11.2.0.4
However, the feature does not log DDLs of some DBMS_STATS operations like:
set_column_stats
set_index_stats
create_extended_stats
drop_extended_stats
set_*_prefs (table/schema/global etc)
delete_pending_stats
publish_pending_stats
export_pending_stats
create_stat_table
There is an enhancement raised with development to add more operations to this mechanism and would get fixed in 12.2.