Est-il possible de trouver la date à laquelle une ligne particulière a été créée dans une table dans une base de données Oracle. (sans insertion de la date et de l'heure de création dans une colonne).
3 Réponses :
Si la journalisation / l'audit pour l'insertion est activé sur votre SGBDR Oracle, oui, il est possible de le faire.
select * from sys.aud$
Ensuite, les journaux d'audit commencent à être enregistrés. Après ce moment, vous pouvez l'interroger à partir de
AUDIT INSERT, UPDATE, DELETE ON MySchema.MyTable BY ACCESS;
Notez que cela nécessite une édition entreprise si je ne me trompe pas. Et il n'affichera pas les informations des lignes créées avant l'activation de l'audit.
Vous pouvez utiliser la pseudo-colonne ORA_ROWSCN dans votre requête. Regardez:
SELECT SCN_TO_TIMESTAMP(ORA_ROWSCN), last_name FROM employees WHERE employee_id = 188;
Veuillez également consulter la documentation à ce sujet: https://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns007.htm
Selon doc 'Cette pseudo-colonne est utile pour déterminer approximativement quand une ligne a été mise à jour pour la dernière fois.'
Vous ne pouvez également convertir le SCN en horodatage que pour une durée limitée - après cela, vous obtiendrez ORA-08181 . Et selon la façon dont la table a été créée, cela peut être la dernière mise à jour du bloc , pas nécessairement une ligne spécifique (comme le dit le document auquel vous vous êtes plié).
@Alex Pool: Oui, j'ai essayé pour certains SCN, certains d'entre eux donnant ORA-08181: le numéro spécifié n'est pas un numéro de changement de système valide
Par exemple 1. Insérer. Utilisation des fonctionnalités Flashback.
CREATE TABLE manager.test2 (p1 NUMBER, p2 VARCHAR2(200 BYTE), p3 VARCHAR2(100 BYTE) ) select * from test2; p1 p2 p3 ---------- --------------- -------- 22 24 54 124 124 test2 test1 225 test10 225 test10 225 test10 225 test10 225 test10 225 test10 225 test10 test4 225 test10 test4 update test2 set p1=10 where p1=124 ==> 2 row(s) updated SELECT versions_xid XID, versions_startscn START_SCN, versions_endscn END_SCN, versions_operation OPERATION, p1, p2, p3, ROWIDTOCHAR(ROWID) FROM manager.test2 VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE; XID, START_SCN, END_SCN, OPERATION, p1, p2, p3, ROWIDTOCHAR(ROWID) 07000F0051030B00 1404163252291 U 10 test2 test1 AAA2wgAAbAAAAEsAAE 07000F0051030B00 1404163252291 U 10 AAA2wgAAbAAAAEsAAD 22 AAA2wgAAbAAAAEsAAA 24 AAA2wgAAbAAAAEsAAB 54 AAA2wgAAbAAAAEsAAC 1404163252291 124 AAA2wgAAbAAAAEsAAD 1404163252291 124 test2 test1 AAA2wgAAbAAAAEsAAE 225 test10 AAA2wgAAbAAAAEsAAF 225 test10 AAA2wgAAbAAAAEsAAG 225 test10 AAA2wgAAbAAAAEsAAH 225 test10 AAA2wgAAbAAAAEsAAI 225 test10 AAA2wgAAbAAAAEsAAJ 225 test10 AAA2wgAAbAAAAEsAAK 225 test10 test4 AAA2wgAAbAAAAEsAAL 225 test10 test4 AAA2wgAAbAAAAEsAAM SQL> SELECT SCN_TO_TIMESTAMP('1404163252291') FROM dual; SCN_TO_TIMESTAMP('1404163252291') -------------------------------------------------------------------------- 24.01.19 14:08:27,000000000 SELECT xid, start_scn , commit_scn COMMIT,operation OP, logon_user ,undo_sql FROM flashback_transaction_query WHERE xid = HEXTORAW('07000F0051030B00'); 07000F0051030B00 1404163252288 1404163252291 UPDATE MANAGER update "MANAGER"."TEST2" set "P1" = '124' where ROWID = 'AAA2wgAAbAAAAEsAAE'; 07000F0051030B00 1404163252288 1404163252291 UPDATE MANAGER update "MANAGER"."TEST2" set "P1" = '124' where ROWID = 'AAA2wgAAbAAAAEsAAD'; 07000F0051030B00 1404163252288 1404163252291 BEGIN MANAGER
Par exemple 2.Mise à jour. Utilisation des fonctionnalités Flashback.
insert into test2(p1,p2,p3) values(1,'test_insert','test') ==> 1 row(s) inserted SELECT versions_xid XID, versions_startscn START_SCN, versions_endscn END_SCN, versions_operation OPERATION, p1, p2, p3, ROWIDTOCHAR(ROWID) FROM manager.test2 VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE; XID, START_SCN, END_SCN, OPERATION, p1, p2, p3, ROWIDTOCHAR(ROWID) 04000A0054FD0A00 1404377619968 I 1 test_insert test AAA2wgAAbAAAAEsAAO 22 AAA2wgAAbAAAAEsAAA 24 AAA2wgAAbAAAAEsAAB 54 AAA2wgAAbAAAAEsAAC 10 AAA2wgAAbAAAAEsAAD 10 test2 test1 AAA2wgAAbAAAAEsAAE 225 test10 AAA2wgAAbAAAAEsAAF 225 test10 AAA2wgAAbAAAAEsAAG 225 test10 AAA2wgAAbAAAAEsAAH 225 test10 AAA2wgAAbAAAAEsAAI 225 test10 AAA2wgAAbAAAAEsAAJ 225 test10 AAA2wgAAbAAAAEsAAK 225 test10 test4 AAA2wgAAbAAAAEsAAL 225 test10 test4 AAA2wgAAbAAAAEsAAM 50 test insert test AAA2wgAAbAAAAEsAAN SQL> SELECT SCN_TO_TIMESTAMP('1404377619968') FROM dual; SCN_TO_TIMESTAMP('1404377619968') --------------------------------------------------------------------------- 25.01.19 07:32:12,000000000 SELECT SCN_TO_TIMESTAMP(ORA_ROWSCN),p1,p2,p3 FROM test2 25.01.19 07:32:12,000000000 22 25.01.19 07:32:12,000000000 24 25.01.19 07:32:12,000000000 54 25.01.19 07:32:12,000000000 10 25.01.19 07:32:12,000000000 10 test2 test1 25.01.19 07:32:12,000000000 225 test10 25.01.19 07:32:12,000000000 225 test10 25.01.19 07:32:12,000000000 225 test10 25.01.19 07:32:12,000000000 225 test10 25.01.19 07:32:12,000000000 225 test10 25.01.19 07:32:12,000000000 225 test10 25.01.19 07:32:12,000000000 225 test10 test4 25.01.19 07:32:12,000000000 225 test10 test4 25.01.19 07:32:12,000000000 50 test insert test 25.01.19 07:32:12,000000000 1 test_insert test
Monsieur, je parle de la ligne créée datetime et non de la ligne mise à jour datetime lorsque vous mettez à jour la ligne. update test2 set p1 = 10 où p1 = 124
Non, ce n'est pas possible
@a_horse_with_no_name, c'est en fait possible. Vous voudrez peut-être vérifier les réponses à ce sujet. Si vous avez des commentaires que nous ne connaissons pas, veuillez laisser un commentaire. Je vous remercie