SQL - Найти оператор, который вставляет конкретные значения - PullRequest
1 голос
/ 18 июня 2019

Я работаю с базой данных Oracle, взаимодействуя с ней как из Oracle SQL Developer, так и из R. Эта база данных используется несколькими людьми, но из-за некоторых правил компании мы все используем одного и того же пользователя для взаимодействия с ней.

В одной из наших таблиц мы обнаружили странное поведение, когда строка постоянно вставляется без какого-либо порядка, о котором мы знаем.

Скажем, в Таблице 1 иногда есть строка со значением Name =«Test» создан> 8K раз, и мы не можем понять, почему это происходит.

Что я хотел сделать, это создать какой-то автоматизм (триггер), который, когда строка с Name = "Тест "вставлен в таблицу 1, сохраняет запрос, который сделал это и дату / время.

Ответы [ 2 ]

3 голосов
/ 18 июня 2019

Вы можете использовать функцию аудит оракула. ​​

-- to start auditing on table
AUDIT INSERT, UPDATE, DELETE ON <Schemaname>.<tablename> BY ACCESS WHENEVER SUCCESSFUL;

-- after auditing is started, execute below query to get the audit data
-- Modify the where condition according to your need
SELECT
    OS_USER,
    USERHOST,
    DB_USER,
    TO_CHAR(EXTENDED_TIMESTAMP, 'DD-MON-RRRR HHAM:MI:SS'),
    OBJECT_SCHEMA,
    OBJECT_NAME,
    STATEMENT_TYPE,
    SQL_TEXT,
    SQL_BIND
FROM
    DBA_COMMON_AUDIT_TRAIL
WHERE OBJECT_SCHEMA = <Schemaname>
  AND OBJECT_NAME = <tablename>
ORDER BY
    4 DESC;

Параметры аудита могут быть установлены на уровне базы данных с помощью следующего параметра:

AUDIT_TRAIL = {NONE or FALSE | OS | БД или ИСТИНА | dB_EXTENDED | XML | XML_EXTENDED}

В следующем списке приведено описание каждого значения:

  • НЕТ или ЛОЖЬ -> Аудит отключен. По умолчанию до Oracle 10g.
  • DB или TRUE -> Аудит включен, все записи аудита хранятся в журнале аудита базы данных (AUD $). По умолчанию от Oracle 11g.
  • DB_EXTENDED -> То же, что и DB, но столбцы SQL_BIND и SQL_TEXT также заполнены.
  • XML-> Аудит включен, все записи аудита хранятся в виде файлов ОС в формате XML.
  • XML_EXTENDED -> То же, что и XML, но столбцы SQL_BIND и SQL_TEXT также заполняются.
  • ОС -> Аудит включен, и все записи аудита направляются в файл операционной системы, заданный параметром AUDIT_FILE_DEST.

Надеюсь, это будет вам полезно.

Ура !!

3 голосов
/ 18 июня 2019

При наличии архивных журналов за период поиска. Вы должны использовать утилиту LogMiner. Пример 1.

EXECUTE DBMS_LOGMNR.add_logfile(LOGFILENAME => '/oracle/app/oracle/product/11.2/admin/edcu/arc_redo_log/1_39306_769799469.dbf', OPTIONS => DBMS_LOGMNR.NEW); 
EXECUTE DBMS_LOGMNR.add_logfile(LOGFILENAME => '/oracle/app/oracle/product/11.2/admin/edcu/arc_redo_log/1_39307_769799469.dbf', OPTIONS => DBMS_LOGMNR.addfile); 
EXECUTE DBMS_LOGMNR.add_logfile(LOGFILENAME => '/oracle/app/oracle/product/11.2/admin/edcu/arc_redo_log/1_39308_769799469.dbf', OPTIONS => DBMS_LOGMNR.addfile); 
EXECUTE DBMS_LOGMNR.add_logfile(LOGFILENAME => '/oracle/app/oracle/product/11.2/admin/edcu/arc_redo_log/1_39309_769799469.dbf', OPTIONS => DBMS_LOGMNR.addfile); 
EXECUTE DBMS_LOGMNR.START_LOGMNR(OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);

SELECT 
to_char(timestamp,'DD-MM-YYYY HH24:MI:SS'),
operation,username,  
os_username,
machine_name,
session_info,
sql_redo

 FROM v$logmnr_contents
where 
seg_owner='MANAGER' and  seg_name='TEST2'

14-12-2017 09:40:20 DDL     MANAGER DeminDV KRW\IVC-PTK-DEMIN   login_username=MANAGER client_info= OS_username=DeminDV Machine_name=KRW\IVC-PTK-DEMIN  create table test2 (p1 number);
14-12-2017 09:40:47 INSERT  MANAGER DeminDV KRW\IVC-PTK-DEMIN   login_username=MANAGER client_info= OS_username=DeminDV Machine_name=KRW\IVC-PTK-DEMIN  insert into "MANAGER"."TEST2"("COL 1") values (HEXTORAW('c117'));
14-12-2017 09:40:53 INSERT  MANAGER DeminDV KRW\IVC-PTK-DEMIN   login_username=MANAGER client_info= OS_username=DeminDV Machine_name=KRW\IVC-PTK-DEMIN  insert into "MANAGER"."TEST2"("COL 1") values (HEXTORAW('c119'));
14-12-2017 09:40:57 INSERT  MANAGER DeminDV KRW\IVC-PTK-DEMIN   login_username=MANAGER client_info= OS_username=DeminDV Machine_name=KRW\IVC-PTK-DEMIN  insert into "MANAGER"."TEST2"("COL 1") values (HEXTORAW('c137'));
14-12-2017 09:41:01 INSERT  MANAGER DeminDV KRW\IVC-PTK-DEMIN   login_username=MANAGER client_info= OS_username=DeminDV Machine_name=KRW\IVC-PTK-DEMIN  insert into "MANAGER"."TEST2"("COL 1") values (HEXTORAW('c20219'));
14-12-2017 09:41:45 DDL     MANAGER DeminDV KRW\IVC-PTK-DEMIN   login_username=MANAGER client_info= OS_username=DeminDV Machine_name=KRW\IVC-PTK-DEMIN  alter table test2 add (p2 varchar2(200));
14-12-2017 09:42:12 INSERT  MANAGER DeminDV KRW\IVC-PTK-DEMIN   login_username=MANAGER client_info= OS_username=DeminDV Machine_name=KRW\IVC-PTK-DEMIN  insert into "MANAGER"."TEST2"("COL 1","COL 2") values (HEXTORAW('c20219'),HEXTORAW('746573743220746573743120'));
14-12-2017 09:42:24 INSERT  MANAGER DeminDV KRW\IVC-PTK-DEMIN   login_username=MANAGER client_info= OS_username=DeminDV Machine_name=KRW\IVC-PTK-DEMIN  insert into "MANAGER"."TEST2"("COL 1","COL 2") values (HEXTORAW('c2021a'),HEXTORAW('746573743420746573743420'));
14-12-2017 09:46:24 INSERT  MANAGER DeminDV KRW\IVC-PTK-DEMIN   login_username=MANAGER client_info= OS_username=DeminDV Machine_name=KRW\IVC-PTK-DEMIN  insert into "MANAGER"."TEST2"("COL 1","COL 2") values (HEXTORAW('c2021a'),HEXTORAW('746573743420746573743420'));
14-12-2017 09:46:25 INSERT  MANAGER DeminDV KRW\IVC-PTK-DEMIN   login_username=MANAGER client_info= OS_username=DeminDV Machine_name=KRW\IVC-PTK-DEMIN  insert into "MANAGER"."TEST2"("COL 1","COL 2") values (HEXTORAW('c2021a'),HEXTORAW('746573743420746573743420'));
14-12-2017 09:46:26 INSERT  MANAGER DeminDV KRW\IVC-PTK-DEMIN   login_username=MANAGER client_info= OS_username=DeminDV Machine_name=KRW\IVC-PTK-DEMIN  insert into "MANAGER"."TEST2"("COL 1","COL 2") values (HEXTORAW('c2021a'),HEXTORAW('746573743420746573743420'));
14-12-2017 09:46:27 INSERT  MANAGER DeminDV KRW\IVC-PTK-DEMIN   login_username=MANAGER client_info= OS_username=DeminDV Machine_name=KRW\IVC-PTK-DEMIN  insert into "MANAGER"."TEST2"("COL 1","COL 2") values (HEXTORAW('c2021a'),HEXTORAW('746573743420746573743420'));
14-12-2017 09:46:28 INSERT  MANAGER DeminDV KRW\IVC-PTK-DEMIN   login_username=MANAGER client_info= OS_username=DeminDV Machine_name=KRW\IVC-PTK-DEMIN  insert into "MANAGER"."TEST2"("COL 1","COL 2") values (HEXTORAW('c2021a'),HEXTORAW('746573743420746573743420'));
14-12-2017 09:54:37 DDL     MANAGER DeminDV KRW\IVC-PTK-DEMIN   login_username=MANAGER client_info= OS_username=DeminDV Machine_name=KRW\IVC-PTK-DEMIN   comment on table test2 is  'test';
14-12-2017 10:16:36 DDL     MANAGER DeminDV KRW\IVC-PTK-DEMIN   login_username=MANAGER client_info= OS_username=DeminDV Machine_name=KRW\IVC-PTK-DEMIN  alter table test2 add  (p3 varchar2(100));
14-12-2017 10:17:07 INSERT  MANAGER DeminDV KRW\IVC-PTK-DEMIN   login_username=MANAGER client_info= OS_username=DeminDV Machine_name=KRW\IVC-PTK-DEMIN  insert into "MANAGER"."TEST2"("P1","P2","P3") values ('125','test6','test4 ');
14-12-2017 10:17:08 INSERT  MANAGER DeminDV KRW\IVC-PTK-DEMIN   login_username=MANAGER client_info= OS_username=DeminDV Machine_name=KRW\IVC-PTK-DEMIN  insert into "MANAGER"."TEST2"("P1","P2","P3") values ('125','test6','test4 ');
'

Пример 2. Использование функций Flashback

   update manager.test2 set p2='test10' where p1=125;
    commit;

    SELECT versions_xid XID, versions_startscn START_SCN,
      versions_endscn END_SCN, versions_operation OPERATION,
      p1, p2, p3 FROM manager.test2
    VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE;

XID                                         START_SCN           END_SCN       OPERATION       P1     P2     P3                                                                                                   
---------------------- ------------------------ ---------------------- --------------- ---------- -------- ------
08000E000DD70900        1374388524564                                                 U          125 test10   test4                                                                                                
08000E000DD70900        1374388524564                                                 U          125 test10   test4                                                                                                
08000E000DD70900        1374388524564                                                 U          125 test10                                                                                                            
08000E000DD70900        1374388524564                                                 U          125 test10                                                                                                                       
                                                               1374388524564                     125 test4 test4    
                                                               1374388524564                     125 test4 test4    
                                                               1374388524564                     125 test6 test4 
                                                               1374388524564                     125 test6 test4      



            SELECT  xid, start_scn , commit_scn COMMIT,operation OP, logon_user ,undo_sql FROM flashback_transaction_query
                   WHERE xid = HEXTORAW('08000E000DD70900');

    XID                      START_SCN  COMMIT                OP    LOGON_USER                           UNDO_SQL                                                                                             
-------------------------------- -------------------------------- -------------------------------------- --------------------------------- ------------------------------------                                                        
        08000E000DD70900    1374388524537   1374388524564   UPDATE  MANAGER update "MANAGER"."TEST2" set "P2" = 'test6' where ROWID = 'AAA2wgAAbAAAAEsAAM';
        08000E000DD70900    1374388524537   1374388524564   UPDATE  MANAGER update "MANAGER"."TEST2" set "P2" = 'test6' where ROWID = 'AAA2wgAAbAAAAEsAAL';
        08000E000DD70900    1374388524537   1374388524564   UPDATE  MANAGER update "MANAGER"."TEST2" set "P2" = 'test4 test4 ' where ROWID = 'AAA2wgAAbAAAAEsAAK';
        08000E000DD70900    1374388524537   1374388524564   UPDATE  MANAGER update "MANAGER"."TEST2" set "P2" = 'test4 test4 ' where ROWID = 'AAA2wgAAbAAAAEsAAJ';
        08000E000DD70900    1374388524537   1374388524564   UPDATE  MANAGER update "MANAGER"."TEST2" set "P2" = 'test4 test4 ' where ROWID = 'AAA2wgAAbAAAAEsAAI';
        08000E000DD70900    1374388524537   1374388524564   UPDATE  MANAGER update "MANAGER"."TEST2" set "P2" = 'test4 test4 ' where ROWID = 'AAA2wgAAbAAAAEsAAH';
        08000E000DD70900    1374388524537   1374388524564   UPDATE  MANAGER update "MANAGER"."TEST2" set "P2" = 'test4 test4 ' where ROWID = 'AAA2wgAAbAAAAEsAAG';
        08000E000DD70900    1374388524537   1374388524564   UPDATE  MANAGER update "MANAGER"."TEST2" set "P2" = 'test4 test4 ' where ROWID = 'AAA2wgAAbAAAAEsAAF';
        08000E000DD70900    1374388524537   1374388524564   BEGIN   MANAGER 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...