журнал транзакций вставки таблицы оракула - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть приложение, построенное поверх фреймворка;фреймворк обрабатывает все сообщения и запросы в / из БД. У меня Oracle 12c.

Приложение представляет собой систему электронного документооборота;У меня есть один документ, когда попытка его фиксации приведет к ошибке, ошибка не настолько очевидна, как в начале, управляемой фреймворком, ошибка, связанная с процессом фиксации БД. Я безуспешно пытался проверить ограничение / индекс для этой конкретной таблицы, связанной с eDoc.

Как я могу получить больше журналов от самого oracle при вставке данных, надеясь, что смогу лучше понять, почемуошибка происходит.

С уважением

1 Ответ

1 голос
/ 06 ноября 2019

Если у вас есть тестовая база данных, в которой вы можете воспроизвести ошибку, вы можете создать триггер 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!!!') |
+---------------------------------+--------------------------------------------------------------------------------------+--------------------------------------------------------+

Итак,

  1. Создайте AFTER SERVERERRORS триггер
  2. Воспроизведите ошибку
  3. Проверьте таблицу, в которую ваш триггер записывает
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...