Cách kiểm tra một bảng có phải là Temporal Table trong Oracle?

Nếu bạn định nghĩa một bảng trong Oracle sử dụng tính năng “Temporal Validity” (Hiệu lực tạm thời) trong Oracle, ví dụ như sau:

SQL> create table t (
  2    id         number(10) not null,
  3    blah       number(10) not null,
  4    start_date date,
  5    end_date   date,
  6    period for per (start_date, end_date)
  7  );

Table created.

Thì bạn có thể kiểm tra hoặc tìm kiếm thông tin này ở đâu trong cơ sở dữ liệu của Oracle??? Không có cột “IS_TEMPORAL” trên USER_TABLES và cả cách generate DDL đầy đủ cho bảng để kiểm tra:

SQL> select dbms_metadata.get_ddl('TABLE','T') from dual

DBMS_METADATA.GET_DDL(UPPER('TABLE'),UPPER('T'),UPPER(''))
--------------------------------------------------------------------------------------

  CREATE TABLE "MCDONAC"."T"
   (    "ID" NUMBER(10,0) NOT NULL ENABLE,
        "BLAH" NUMBER(10,0) NOT NULL ENABLE,
        "START_DATE" DATE,
        "END_DATE" DATE
   )  DEFAULT COLLATION "USING_NLS_COMP" SEGMENT CREATION DEFERRED
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  TABLESPACE "USERS"
  ALTER TABLE "MCDONAC"."T" ADD PERIOD FOR "PER"("START_DATE","END_DATE")

Dường như không có bất kỳ cơ chế nào để xác định thuộc tính này. Bạn có thể đưa ra một số dự đoán bằng cách xem query dữ liệu trong bảng USER_TAB_COLS, nơi có thông tin về cột ẩn (Hidden) hay không

SQL> select column_name, hidden_column
  2  from   user_tab_cols
  3  where  table_name = 'T';

COLUMN_NAME                    HID
------------------------------ ---
PER                            YES
ID                             NO
BLAH                           NO
START_DATE                     NO
END_DATE                       NO

Nhưng vấn đề ở đó là giá trị thời gian có thể được xác định bằng cách sử dụng các cột ẩn (hidden), như theo ví dụ trên hoặc được định nghĩa đơn giản bằng tên chu kỳ (period) và sau đó các cột hỗ trợ sẽ được tự động thêm vào bảng, nhưng dưới dạng cột ẩn. Dưới đây là ví dụ về trường hợp thứ hai, khi chỉ cung cấp tên chu kỳ (period name) và ta nhận được được 3 cột ẩn thay vì chỉ 1.

SQL> create table t (
  2    id         number(10) not null,
  3    blah       number(10) not null,
  4    period for per
  5  );

Table created.

SQL> select column_name, hidden_column
  2  from   user_tab_cols
  3  where  table_name = 'T';

COLUMN_NAME                    HID
------------------------------ ---
PER_START                      YES
PER_END                        YES
PER                            YES
ID                             NO
BLAH                           NO

Từ thông tin trên mà chúng ta đánh giá bảng là temporal hay không thì khá là rủi ro và không chính xác. Chính xác là database phải biết bằng cách nào đó rằng một bảng có định nghĩa các khoảng thời gian (temporal periods), và nó nằm ở trong view nội bộ của cơ sở dữ liệu: SYS_FBA_PERIOD – mà không có bất kỳ tiền tố DBA_, ALL_, hoặc USER_ nào, làm cho việc xác định nó rất khó khăn.

Truy vấn view SYS_FBA_PERIOD này có liên kết tới USER_OBJECTS cung cấp cho ta đủ thông tin để xác định thông tin về khoảng thời gian:

SQL> select periodname, periodstart, periodend
  2  from sys.SYS_FBA_PERIOD
  3  where obj# =
  4    ( select object_id
  5      from user_objects
  6      where object_name = 'T');

PERIODNAME      PERIODSTART     PERIODEND
--------------- --------------- ---------------
PER             START_DATE      END_DATE

Do đó, nếu bạn đang sử dụng các bảng tạm thời, thì bạn có thể tạo lại view để hỗ trợ việc bảo trì cơ sở dữ liệu của mình và cung cấp điều này cho người dùng như sau:

SQL> conn / as sysdba
Connected.
SQL> create or replace
  2  view sys.user_fba_period as
  3  select o.name table_name,
  4         s.periodname period_name,
  5         s.periodstart period_start,
  6         s.periodend period_end
  7  from sys.sys_fba_period s,
  8       sys.obj$ o
  9  where o.obj# = s.obj#
 10  and   o.owner# = userenv('SCHEMAID');

View created.

SQL> grant select on sys.user_fba_period to public;

Grant succeeded.

SQL> create or replace public synonym user_fba_period for sys.user_fba_period;

Synonym created.