از اوراکل 11g می توان یک جدول را در حالت read only قرار داد:
SQL> alter table usef.mytbl read only;
Table altered.
SQL> alter table usef.mytbl read write;
Table altered.
اما در این نسخه و همچنین نسخه 12cR1، قابلیت قرار دادن پارتیشنی از جدول در حالت read only وجود ندارد:
SQL*Plus: Release 12.1.0.2.0 Production on Sat Dec 14 17:10:54 2019
SQL> alter session set container=PDB12R1;
Session altered.
SQL> alter table usef.mytbl modify partition p_2000 read only;
ORA-14049: invalid ALTER TABLE MODIFY PARTITION option
این قابلیت در نسخه 12cR2 به اوراکل اضافه شد و از این نسخه به بعد می توان پارتیشنهای مشخصی از جدول را در حالت read only قرار داد:
SQL*Plus: Release 12.2.0.1.0 Production on Sat Dec 14 17:24:57 2019
SQL> alter session set container=PDB12R2;
Session altered.
SQL> alter table usef.mytbl modify partition p_2000 read only;
Table altered.
SQL> select partition_name,read_only from dba_tab_partitions where table_name=’MYTBL’;
PARTITION_ READ_ONLY
———- ————
P_2000 YES
P_2010 NO
P_2020 NO
با این تغییر، امکان هرگونه اصلاح اطلاعات این پارتیشن از بین خواهد رفت:
SQL> insert into usef.mytbl values(1,TO_date(‘1-1-1999’, ‘DD-MM-YYYY’));
ORA-14466: Data in a read-only partition or subpartition cannot be modified.
علاوه بر دستور alter table، در زمان ساخت جدول هم می توان تعدادی از پارتیشنها را در حالت read only قرار داد:
create table usef.mytbl (
id number(6),
time_ date
)
PARTITION BY RANGE (time_)
INTERVAL(NUMTOYMINTERVAL(10, ‘YEAR’))
( PARTITION p_2000 VALUES LESS THAN (TO_date(‘1-1-2000’, ‘DD-MM-YYYY’))read only,
PARTITION p_2010 VALUES LESS THAN (TO_date(‘1-1-2010’, ‘DD-MM-YYYY’)),
PARTITION p_2020 VALUES LESS THAN (TO_date(‘1-1-2020’, ‘DD-MM-YYYY’))
);
همچنین می توان جدولی را در حالت read only ایجاد کرد و صرفا پارتیشنهای خاصی از ان را در حالت read write قرار داد:
create table usef.mytbl (
id number(6),
time_ date
)
read only
PARTITION BY RANGE (time_)
INTERVAL(NUMTOYMINTERVAL(10, ‘YEAR’))
( PARTITION p_2000 VALUES LESS THAN (TO_date(‘1-1-2000’, ‘DD-MM-YYYY’))read write,
PARTITION p_2010 VALUES LESS THAN (TO_date(‘1-1-2010’, ‘DD-MM-YYYY’)),
PARTITION p_2020 VALUES LESS THAN (TO_date(‘1-1-2020’, ‘DD-MM-YYYY’))
);
SQL> select partition_name,read_only from dba_tab_partitions where table_name=’MYTBL’;
PARTITION_ READ_ONLY
———- ————
P_2000 NO
P_2010 YES
P_2020 YES
Comment (1)