如何在Oracle中查找特定表的创建时间?

51
在Oracle中,有没有一种方法可以查找特定表的创建时间?
同样,有没有一种方法可以查找特定行的插入/最后更新时间?
5个回答

83
SELECT created
  FROM dba_objects
 WHERE object_name = <<your table name>>
   AND owner = <<owner of the table>>
   AND object_type = 'TABLE'

将告诉您表格创建的时间(如果您无法访问DBA_OBJECTS,则可以使用ALL_OBJECTS代替,前提是您对表具有SELECT权限)。

从行获取时间戳的一般方法是,只有在添加列来跟踪该信息后才能获取这些数据(当然,假设您的应用程序也填充列)。然而,有各种特殊情况。如果DML相对较新(最可能在过去几个小时内),则应该能够从闪回查询中获取时间戳。如果DML发生在最近几天(或者您保留已归档的日志的天数),则可以使用LogMiner提取时间戳,但如果要获取多个行的时间戳,则这将是一个非常昂贵的操作。如果使用ROWDEPENDENCIES启用构建表格(不是默认值),则可以使用

SELECT scn_to_timestamp( ora_rowscn ) last_modified_date,
       ora_rowscn last_modified_scn,
       <<other columns>>
  FROM <<your table>>

要获取行的最后修改日期和SCN(系统更改号),但默认情况下,如果没有ROWDEPENDENCIES,则SCN仅在块级别上。而SCN_TO_TIMESTAMP函数也不能永远将SCN映射到时间戳。


这可以应用于视图搜索。 - Tom Tom

13

您可以查询数据字典/目录视图,以查找对象的创建时间以及最后一次涉及该对象的DDL(例如:alter table)的时间。

select * 
  from all_objects 
 where owner = '<name of schema owner>'
   and object_name = '<name of table>'

"CREATED"列告诉您对象创建的时间。
"LAST_DDL_TIME"列告诉您上次对该对象执行DDL操作的时间。

至于特定行何时插入/更新,您可以使用像“insert_timestamp”列这样的审核列,或使用触发器并填充审核表。


11
您只需将以下代码复制并粘贴即可,它将显示所有带有“名称”和“创建日期”的表格。
SELECT object_name,created FROM user_objects
WHERE object_name LIKE  '%table_name%'
AND object_type = 'TABLE'; 
注意:请将'%table_name%'替换为您要查找的表名。

我使用了这个例子,并添加了从最旧的表开始排序和添加60天条件,解决方案运行良好: select * FROM user_objects where object_type = 'TABLE' and created > current_date - 60 order by timestamp - dkero
注意:也许最好使用ALL_OBJECTS,因为该表包含所有模式的对象,而USER_OBJECTS表仅与一个模式相关。 - dkero

4
SELECT CREATED FROM USER_OBJECTS WHERE OBJECT_NAME='<<YOUR TABLE NAME>>'

2
这与四年前被接受的答案有何不同? - user330315
这里我使用了不同的表,没有别的。dba_object和user_object之间的区别 - Saurabh Gadariya
请编辑您的答案,添加关于代码如何工作以及如何解决 OP 的问题的说明。许多 SO 的帖子作者都是新手,可能无法理解您发布的代码。 - i alarmed alien

-6

请尝试以下查询语句:

SELECT sysdate FROM schema_name.table_name;

这应该显示您可能需要的时间戳。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接