Аудит нарушения ограничений Oracle?

Могу ли я провести аудит нарушения ограничений Oracle?

Я создал ограничение в таблице и хочу проверить его, когда какой-то процесс нарушает это ограничение. Это возможно? Как мне это сделать?

Я использую Oracle 11g.


person Flavio    schedule 17.09.2013    source источник


Ответы (1)


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

-- our test table
SQL> create table TB_Test(
  2    col1 number primary key,
  3    col2 number,
  4    col3 number,
  5    constraint CHK_CONS check (col3 < 5)
  6  )
  7  ;

 -- table we going to log errors into   
SQL> create table Db_Errors(
  2    msg varchar2(1000)
  3  )
  4  ;

Table created

-- schema level trigger, which fires when 
-- exception of certain code is raised.
-- In this case, we filter exceptions' codes out in the when clause 
-- of the trigger.
-- 1     - unique constraint violation
-- 2290  - check constraint violation
-- 2292  - foreign key constraint violation
-- you can add more
SQL> create or replace trigger TR_CatchErrors
  2  after servererror on schema
  3  when (ora_server_error(1) in (1, 2290, 2292))
  4  begin
  5    insert into Db_Errors(Msg)
  6      values(ora_server_error_msg(1));
  7  end;
  8  /

Trigger created

-- Test case;
-- 1  check constraint violation 
SQL> insert into tb_test(col1, col2, col3)
  2    values(1, 2, 6);

insert into tb_test(col1, col2, col3)
  values(1, 2, 6)

ORA-02290: check constraint (HR.CHK_CONS) violated

-- unique constraint violation
SQL> insert into tb_test(col1, col2, col3)
  2    values(1, 2, 4);

insert into tb_test(col1, col2, col3)
  values(1, 2, 4)

ORA-00001: unique constraint (HR.SYS_C0014608) violated

-- And here what we have in our DB_Errors table logged
SQL> select msg 
  2    from db_errors;

MSG
--------------------------------------------------------------------------------
ORA-02290: check constraint (HR.CHK_CONS) violated
ORA-00001: unique constraint (HR.SYS_C0014608) violated

В качестве другого варианта (начиная с 10gR2) вы можете использовать предложение log errors оператора DML. Но это потребует от вас предоставить предложение log errors для каждого оператора dml. Вот пример:

-- create a table for error logging
-- using create_error_log() procedure of dbms_errlog package
-- for a specific table. You could also create your own custom 
-- error logging table

begin
  dbms_errlog.create_error_log('TB_TEST');
end;

-- unique constraint violation
SQL> insert into tb_test(col1, col2, col3)
  2    values(1, 2, 3)
  3  log errors reject limit unlimited
  4  ;

0 rows inserted


SQL> select ora_err_mesg$
  2    from err$_tb_test t
  3  ;

ORA_ERR_MESG$
--------------------------------------------------------------------------------
ORA-00001: unique constraint (HR.SYS_C0014608) violated
person Nick Krasnov    schedule 17.09.2013