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.
Leave a Review