oracle table 插入事务日志
oracle table insert transaction log
我有一个构建在框架之上的应用程序;该框架处理所有通信并请求 to/from 数据库。我有 Oracle 12c。
该应用程序是一个电子文档管理系统;我有一个文档在尝试提交时会生成错误,该错误不是框架控制的开始时不言自明的错误,该错误与数据库提交过程有关。
我试图检查 constraint/Index 中与 eDoc 相关的特定 table,但没有成功。
如何在插入数据时从 oracle 本身获取更多日志,希望我能更好地了解错误发生的原因。
此致
如果您有一个可以重现错误的测试数据库,您可以创建一个 AFTER SERVERERROR
触发器来记录发生的任何错误。
如果您在生产环境中尝试这样做,您可能会面临访问数据库的所有用户和应用程序出现大规模问题的风险,尤其是如果您犯了一个错误。 强烈建议在 dev/QA 实例中执行此操作!
这里有一个简短的例子来说明如何做到这一点:
-- Create a table to hold the error log
CREATE TABLE matt1_errors (
error_ts TIMESTAMP,
stacktrace VARCHAR2(4000),
sql_stmt VARCHAR2(4000));
/
-- Create a trigger to log any server errors that occur
CREATE TRIGGER matt_log_errors AFTER SERVERERROR ON DATABASE
DECLARE
l_sql_pieces_list DBMS_STANDARD.ora_name_list_t;
piece_count PLS_INTEGER;
l_sql_text VARCHAR2(4000);
BEGIN
piece_count := ora_sql_txt(l_sql_pieces_list);
FOR i IN 1..piece_count LOOP
l_sql_text := substr(l_sql_text || l_sql_pieces_list(i), 1, 4000);
END LOOP;
INSERT INTO matt1_errors ( error_ts, stacktrace, sql_stmt)
VALUES (SYSTIMESTAMP, dbms_utility.format_error_stack, l_sql_text);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE (dbms_utility.format_error_stack);
END;
测试一下...
-- Create a table to insert into.
CREATE TABLE matt1 ( id NUMBER, text VARCHAR2(4) );
-- Cause an error.
insert into matt1 (id, text) VALUES (1, 'Too long!!!');
-- See what we got...
select * from matt1_errors;
+---------------------------------+--------------------------------------------------------------------------------------+--------------------------------------------------------+
| ERROR_TS | STACKTRACE | SQL_STMT |
+---------------------------------+--------------------------------------------------------------------------------------+--------------------------------------------------------+
| 06-NOV-19 03.02.18.083116000 PM | ORA-12899: value too large for column "APPS"."MATT1"."TEXT" (actual: 11, maximum: 4) | insert into matt1 (id, text) VALUES (1, 'Too long!!!') |
+---------------------------------+--------------------------------------------------------------------------------------+--------------------------------------------------------+
所以,
- 创建
AFTER SERVERERRORS
触发器
- 重现您的错误
- 检查您的触发器写入的 table
我有一个构建在框架之上的应用程序;该框架处理所有通信并请求 to/from 数据库。我有 Oracle 12c。
该应用程序是一个电子文档管理系统;我有一个文档在尝试提交时会生成错误,该错误不是框架控制的开始时不言自明的错误,该错误与数据库提交过程有关。 我试图检查 constraint/Index 中与 eDoc 相关的特定 table,但没有成功。
如何在插入数据时从 oracle 本身获取更多日志,希望我能更好地了解错误发生的原因。
此致
如果您有一个可以重现错误的测试数据库,您可以创建一个 AFTER SERVERERROR
触发器来记录发生的任何错误。
如果您在生产环境中尝试这样做,您可能会面临访问数据库的所有用户和应用程序出现大规模问题的风险,尤其是如果您犯了一个错误。 强烈建议在 dev/QA 实例中执行此操作!
这里有一个简短的例子来说明如何做到这一点:
-- Create a table to hold the error log
CREATE TABLE matt1_errors (
error_ts TIMESTAMP,
stacktrace VARCHAR2(4000),
sql_stmt VARCHAR2(4000));
/
-- Create a trigger to log any server errors that occur
CREATE TRIGGER matt_log_errors AFTER SERVERERROR ON DATABASE
DECLARE
l_sql_pieces_list DBMS_STANDARD.ora_name_list_t;
piece_count PLS_INTEGER;
l_sql_text VARCHAR2(4000);
BEGIN
piece_count := ora_sql_txt(l_sql_pieces_list);
FOR i IN 1..piece_count LOOP
l_sql_text := substr(l_sql_text || l_sql_pieces_list(i), 1, 4000);
END LOOP;
INSERT INTO matt1_errors ( error_ts, stacktrace, sql_stmt)
VALUES (SYSTIMESTAMP, dbms_utility.format_error_stack, l_sql_text);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE (dbms_utility.format_error_stack);
END;
测试一下...
-- Create a table to insert into.
CREATE TABLE matt1 ( id NUMBER, text VARCHAR2(4) );
-- Cause an error.
insert into matt1 (id, text) VALUES (1, 'Too long!!!');
-- See what we got...
select * from matt1_errors;
+---------------------------------+--------------------------------------------------------------------------------------+--------------------------------------------------------+
| ERROR_TS | STACKTRACE | SQL_STMT |
+---------------------------------+--------------------------------------------------------------------------------------+--------------------------------------------------------+
| 06-NOV-19 03.02.18.083116000 PM | ORA-12899: value too large for column "APPS"."MATT1"."TEXT" (actual: 11, maximum: 4) | insert into matt1 (id, text) VALUES (1, 'Too long!!!') |
+---------------------------------+--------------------------------------------------------------------------------------+--------------------------------------------------------+
所以,
- 创建
AFTER SERVERERRORS
触发器 - 重现您的错误
- 检查您的触发器写入的 table