我以用户ADMIN身份登录并执行PROCEDURE P1来检查和捕获日志.我在创建触发器时遇到错误
PROCEDURE P1
IS
BEGIN
INSERT statement
BEGIN
---
EXCEPTION
WHEN others THEN
error_mgr.record_error();
END P1;
Run Code Online (Sandbox Code Playgroud)
AS ADMIN用户没有足够的priveledge我作为另一个用户EXTRACT登录并创建了包error_mgr
create or replace
PACKAGE BODY error_mgr
IS
PROCEDURE record_error
IS
PRAGMA AUTONOMOUS_TRANSACTION;
l_code INTEGER := SQLCODE;
l_mesg VARCHAR2(32767) := SQLERRM;
BEGIN
INSERT INTO EXTRACT.error_log
(created_on,created_by,errorcode,callstack,errorstack,backtrace,error_info)
VALUES(SYSDATE,USER,l_code,sys.DBMS_UTILITY.format_call_stack,null,
sys.DBMS_UTILITY.format_error_backtrace,l_mesg);
DBMS_OUTPUT.PUT_LINE('ERROR!!');
COMMIT;
END record_error;
END error_mgr;
Run Code Online (Sandbox Code Playgroud)
注意:EXTRACT也是用户名和架构
提取模式中的ERROR LOG表有一个自动生成列id(LOG_ID)所以在EXTRACT模式中我使用的是序列和触发器
SEQUENCE:
CREATE SEQUENCE "EXTRACT"."SEQ_error_log" MINVALUE 1 MAXVALUE
9999999999999999999999999999 INCREMENT BY 1 START WITH 335 CACHE 20 NOORDER
CYCLE ;
Run Code Online (Sandbox Code Playgroud)
触发:
CREATE TRIGGER EXTRACT.BI_error_log
BEFORE INSERT …Run Code Online (Sandbox Code Playgroud)