read only کردن پارتیشنهای یک جدول

از اوراکل 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

ارتباط با نویسنده مطلب:vahidusefzadeh@ کانال تخصصی اوراکل و لینوکس: OracleDB@

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد.