【问题标题】:How to find Row Creation Date and Time in db table如何在数据库表中查找行创建日期和时间
【发布时间】:2019-06-18 02:09:15
【问题描述】:

是否可以在 Oracle 数据库的表中找到特定行的创建日期。 (未在列中插入创建日期时间)。

【问题讨论】:

  • 不,那不可能
  • @a_horse_with_no_name,其实是可以的。您可能需要检查此问题的答案。如果您有任何我们不知道的评论,请发表评论。谢谢

标签: oracle


【解决方案1】:

您可以在查询中使用 ORA_ROWSCN 伪列。看:

SELECT SCN_TO_TIMESTAMP(ORA_ROWSCN), last_name FROM employees
WHERE employee_id = 188;

请同时查看相关文档:https://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns007.htm

【讨论】:

  • 根据文档“这个伪列对于确定行的最后更新时间非常有用。”
  • 您也只能在有限的时间内将 SCN 转换为时间戳 - after that you'll get ORA-08181。并且取决于表的创建方式,它可能是上次更新 block 的时间,不一定是特定的 row (正如您纠结的文档所说)。
  • @Alex Pool : 是的,我尝试了一些 SCN,其中一些给出了 ORA-08181: specified number is not a valid system change number
【解决方案2】:

如果在您的 Oracle RDBMS 上启用了插入日志/审计功能,则可以这样做。

AUDIT INSERT, UPDATE, DELETE ON MySchema.MyTable BY ACCESS;

然后审计日志开始被记录。在此之后,您可以从

查询它
select * from sys.aud$

【讨论】:

  • 请注意,如果我没记错的话,这需要企业版。并且它不会显示启用审核之前创建的行的信息。
【解决方案3】:

例如 1. 插入。使用闪回功能。

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

例如 2.Update。使用闪回功能。

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 

【讨论】:

  • 先生,我说的是行创建日期时间而不是行更新日期时间,因为您正在更新行。 update test2 set p1=10 where p1=124
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多