Rastgele Yazılar : ORA-12519:TNS:no appropriate service handler found
Rastgele Yazılar : Oracle 11g RMAN ile gelen List Failure, Advise Failure ...
Rastgele Yazılar : BLOCK CHANGE TRACKING
Rastgele Yazılar : İlişkisel Veritabanı, Oracle ve SQL -ORACLE KURULUMU
Rastgele Yazılar : AYNI BİLGİSAYAR DA RAC İÇİN VMWARE SERVER KONFİGURASYON...
Rastgele Yazılar : Sequencelerle İlgili Birkaç Not .
Rastgele Yazılar : Physical Standby Database Üzerinde Switchover Operasyon...
Rastgele Yazılar : ORACLE OBJECT TYPE
Rastgele Yazılar : PLSQL DE BİLİNEN CURSOR TİPLERİ VE KULLANIMI
Rastgele Yazılar : Standby Database Nasıl Gerçek bir Test Ortamına Dönüştü...
Birbiri ile ilişkili(master-child yapıda) tablolardan birisini başka bir tablespace’ ni değiştirdiğimizde tabloyla ilişkili nesnelerin (index-constraint) durumlarını inceleyelim.
Öncelikle veritabanımıza bazı yeni kullanıcı, tablespace oluşturmak için Sqlplus’ a sysdba olarak bağlanalım.
sqlplus / as sysdba
Connected.
Create a tablespace(bir test tablespace oluşturalım)
SQL> create tablespace test_tbs datafile '/u01/app/oracle
/oradata/XDB/datafile/test01.dbf' size 10M autoextend on next 1M;
Tablespace created.
İkinci bir tablespace oluşturuyorum.
SQL> create tablespace test_tbs2 datafile '/u01/app/oracle/oradata/XDB/datafile/test02.dbf' size 10M autoextend on next 1M;
Create a user(bir test kullanıcısı oluşturalım)
SQL> create user test_usr identified by password;
User created.
Daha sonra test_usr kullanıcısına gerekli haklar verelim.
SQL> grant resource,connect to test_usr;
Grant succeeded.
Bu kullanıcıya Default tablespace ve geçici tablespace olarak belirleyelim. Bundaki amaç bu kullanıcının oluşturacağı tablolar ve diğer nesneler default olarak bu tablespace içinde yer alması içindir.
SQL> alter user test_usr default tablespace test_tbs temporary tablespace temp;
User altered.
SQL> conn test_usr/password
Tablo oluştur.
SQL> create table test_table( t_id number, t_name varchar(30), hire_date date );
Table created.
Bildiğimiz gibi oracle diğer veritabanlarında olduğu gibi otomatik artan bir veritipine sahip değildir. Bu amaçla oracle nesnesi olarak sequence oluşturulup tablo kayıtları için kullanılabilir. Böylelikle de sequence nesnesinin de nasıl oluşturulup , tablo üzerinde nasıl kullanacağımızı da pekiştirmiş oluruz.
idmatic isminde bir Sequence oluştur.
SQL> create sequence id_matic
minvalue 1
maxvalue 100
increment by 1
start with 1
nocycle ;
sequence created.
SQL> insert into test_table
2 values(id_matic.nextval,'John',sysdate-30);
1 row created.
2 values(id_matic.nextval,'Jim',sysdate-60);
2 values(id_matic.nextval,'Austin',sysdate-90);
SQL> select * from test_table;
T_ID T_NAME HIRE_DATE
---------- ------------------------------ ----------
2 John 20/01/2012
3 Jim 21/12/2011
4 Austin 21/11/2011
Diğer child tabloyu oluşturuyoruz.
SQL> create table test_child_table(id number,month varchar(20),salary number);
Diğer parent tablo (test_table) ile ilişkiyi sağlamak için bu tabloya bir foreign key tanımlıyorum.
SQL> alter table test_child_table add constraint fk_id_test_ch_tbl foreign key(id) references test_table(t_id);
Table altered.
Daha sonrada indeks testi için bu child tablo üzerinde bir indeks oluşturuyorum. Btree indeksler de oluşturabilirsiniz. Ben Bitmap indeks tercih ettim.
SQL> create bitmap index idx_id_child_tbl on test_child_table (id);
Index created.
Yeni kayıt girelim
SQL> insert into test_child_table values(2,'JAN',2000);
Kullanıcı tablolarını bir sorgulayalım. Bakalım ne yapmışız.
SQL> select table_name,tablespace_name from user_tables;
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
TEST_TABLE TEST_TBS
TEST_CHILD_TABLE TEST_TBS
Test_usr kullanıcısına it user objeleri aşağıda görülmektedir.
SQL> select object_name,OBJECT_TYPE from all_objects where
owner='TEST_USR';
OBJECT_NAME OBJECT_TYPE
------------------------------ -------------------
ID_MATIC SEQUENCE
TEST_TABLE TABLE
PK_T_ID_TEST_TBL INDEX
TEST_CHILD_TABLE TABLE
Daha sonra test_child_table tablosunu test_tbs2 tablespace’ ine taşıyoruz.
SQL> alter table test_child_table move tablespace test_tbs2;
Tekrar kontrol ettiğimizde kullanıcı tablolarını test_child_table tablosunu farklı bir tablespace taşıdığımızı kontrol ettik. Problem yok.
TEST_CHILD_TABLE TEST_TBS2
Bakalım şimdi bu tablo üzerindeki nesneler özellikle indeksler ne durumda diye.
Taşındıktan sonra test_child_table tablosu üzerindeki indeksler unusable(kullanılamaz) hale gelecektir.;
SQL> select index_name,status from user_indexes where table_name='TEST_CHILD_TABLE';
INDEX_NAME STATUS
------------------------------ --------
IDX_ID_CHILD_TBL UNUSABLE
Gördüğümüz gibi tablo taşındıktan sonra mevcut indeksin tablo kayıtları için tuttuğu rowid ‘ler de değiştiği için indeks te artık yeni rowidler mevcut olmadığından unusable duruma düşecektir. Neyseki rebuild edilebilir özelliği olduğundan yeni tablespace üzerinde rebuild edip yeni row id leri listesine alacaktır.
Daha sonra bu indeksi yeni yerinde rebuild yapma ihtiyacımız olacaktır.
SQL> alter index IDX_ID_CHILD_TBL rebuild tablespace test_tbs2 ;
Index altered.
IDX_ID_CHILD_TBL VALID
Şimdi bakalım. Bildiğimiz gibi test_child_table tablosu test_table tablosuna bağımlı bir child tablodur. Yeni yerinde test_child_table tablosuna yeni kayıtlar ekleyelim.
SQL> insert into test_child_table values(3,'FEB',4000);
SQL> select * from test_child_table;
ID MONTH SALARY
---------- -------------------- ----------
2 FEB 4000
3 FEB 4000
Ana tablomuzdak kayıtları inceleyelim.
SQL> insert into test_child_table values(1,'FEB',4000);
insert into test_child_table values(1,'FEB',4000)
*
ERROR at line 1:
ORA-02291: butunluk kısıtlaması (TEST_USR.FK_ID_TEST_CH_TBL) bozuldu – ust anahtar bulunamad?
Tabloyu taşıdık. Ama Ana tabloya bağımlı olan bir foreign key kısıtlaması halen çalışmakta.
Farklı bir makale ile görüşmek üzere.