最少的 Oracle DDL DBA_OBJECTS.LAST_DDL_TIME

Minimal Oracle DDL to bump DBA_OBJECTS.LAST_DDL_TIME

我正在使用外部工具扫描我数据库中的 table。它使用 dba_objects.last_ddl_time 来确定扫描了哪些 table。显然,如果 table 数据在两次扫描之间被修改,则此策略不起作用,所以有时我不得不帮助它...

我需要一种方法来 "bump" 上次 DDL 时间而不实际更改任何内容。 我正在寻找可以在任何 table 上执行的最简单的即时 DDL 语句,只知道 table 名称。 我有 sysdba 权限。

编辑: 例如,我可以使用 comment on table xxx is 'Boom'; 但是我失去了原来的评论。我知道如何解决这个问题,但它不再是一个小而简单的语句,我可以在 sql*plus

中快速计时

更改 LOGGING/NOLOGGING 非常快(虽然不是即时的)。

如果您将 LOGGING 属性设置回其自身,它将对 LAST_DDL_TIME 进行标记而不对 table 进行任何实际更改。下面的这个例子试图触及每个 table 除了 sys tabels(大概你想要更多的限制)

BEGIN
  FOR TABLE_POINTER IN (SELECT OWNER, TABLE_NAME, DECODE(LOGGING,'YES','LOGGING','NOLOGGING') DO_LOGGING 
                        FROM DBA_TABLES WHERE OWNER NOT IN ('SYSTEM','SYS','SYSBACKUP','MDSYS' --etc. other restrictions here
                        ))
  LOOP
    EXECUTE IMMEDIATE UTL_LMS.FORMAT_MESSAGE('ALTER TABLE %s.%s %s',TABLE_POINTER.OWNER, TABLE_POINTER.TABLE_NAME, TABLE_POINTER.DO_LOGGING);
  END LOOP;
END;
/

编辑: 以上不适用于临时 tables。将 PCT_FREE 设置为自身或另一个 suitable 属性等替代方法可能更可取。您可能需要以不同于其他 table 的方式处理 IOTPartitioned Tables 等。