diff --git a/packages/app.spec.sql b/packages/app.spec.sql index 4f2d26f..5c041c8 100644 --- a/packages/app.spec.sql +++ b/packages/app.spec.sql @@ -73,6 +73,11 @@ CREATE OR REPLACE PACKAGE app AS logs_table_name CONSTANT VARCHAR2(30) := 'LOGS'; -- used in purge_old logs_max_age CONSTANT PLS_INTEGER := 7; -- max logs age in days + -- owner of DML error tables + dml_tables_owner CONSTANT VARCHAR2(30) := NULL; -- NULL = same as current owner + dml_tables_postfix CONSTANT VARCHAR2(30) := '_E$'; + view_dml_errors CONSTANT VARCHAR2(30) := 'LOGS_DML_ERRORS'; + -- arrays to specify adhoc requests TYPE arr_log_setup IS VARRAY(100) OF logs_blacklist%ROWTYPE; @@ -1279,6 +1284,27 @@ CREATE OR REPLACE PACKAGE app AS + -- ### DML Error Handling + -- + + -- + -- Drop DML error tables matching filter + -- + PROCEDURE drop_dml_table ( + in_table_name logs.module_name%TYPE + ); + + + + -- + -- Recreates DML error tables matching filter + -- + PROCEDURE create_dml_table ( + in_table_name logs.module_name%TYPE + ); + + + -- -- Refresh views source (convert views source from LONG to searchable lines) -- diff --git a/packages/app.sql b/packages/app.sql index 4b27cbf..9666a33 100644 --- a/packages/app.sql +++ b/packages/app.sql @@ -2967,6 +2967,63 @@ CREATE OR REPLACE PACKAGE BODY app AS + PROCEDURE drop_dml_table ( + in_table_name logs.module_name%TYPE + ) + AS + BEGIN + app.log_module(in_table_name); + + -- process existing data first + app.process_dml_errors(in_table_name); + -- + EXECUTE IMMEDIATE + 'DROP TABLE ' || app.get_dml_table(in_table_name) || ' PURGE'; + -- + app.log_success(); + EXCEPTION + WHEN app.app_exception THEN + RAISE; + WHEN OTHERS THEN + app.raise_error(); + END; + + + + PROCEDURE create_dml_table ( + in_table_name logs.module_name%TYPE + ) + AS + BEGIN + app.log_module(in_table_name); + + -- drop existing tables + app.drop_dml_table(in_table_name); + + -- create DML log tables for all tables + DBMS_ERRLOG.CREATE_ERROR_LOG ( + dml_table_name => app.get_owner(app.get_app_id()) || '.' || in_table_name, + err_log_table_owner => app.get_owner(app.get_app_id()), + err_log_table_name => app.get_dml_table(in_table_name), + skip_unsupported => TRUE + ); + -- + IF app.get_owner(app.get_app_id()) != app.dml_tables_owner THEN + EXECUTE IMMEDIATE + 'GRANT ALL ON ' || app.get_dml_table(in_table_name) || + ' TO ' || app.get_owner(app.get_app_id()); + END IF; + -- + app.log_success(); + EXCEPTION + WHEN app.app_exception THEN + RAISE; + WHEN OTHERS THEN + app.raise_error(); + END; + + + PROCEDURE refresh_user_source_views ( in_view_name VARCHAR2 := NULL, in_force BOOLEAN := FALSE