Diğer dersleri https://selimkaratas.com.tr/oracle-11g-r2-egitimi-ders-notlari adresinden bulabilirsiniz.
2. Managing Schema Objects ( Şema Objelerini Yönetime)
ALTER TABLE STATEMENT
- — Yeni kolon ekleme ( ADD)
- — Kolonları update etme
- — Kolon kaldırma (DROP)
- — Yeni kolon için default değer belirleme
Kolon Ekleme
ALTER TABLE dept80 ADD (job_id VARCHAR2(9));
dept80 adlı tabloyu daha önceki derslerde yapmıştık. eğer rollback yaptıysanız ya da böyle bir tabloya sahip değilseniz öncelikli olarak
CREATE TABLE dept80 AS SELECT employee_id, last_name, salary*12 ANNSAL, hire_date FROM employees WHERE department_id = 80;
diyerek dept80 adlı bir tablo oluşturuyoruz.
ALTER TABLE dep ADD (job_id VARCHAR2(9));
tabloyu gördükten sonra alter table işlemi yapalım. add işleminden sonra tekrar tabloya bakarsak
select * from dept80;
son halini elde ederiz.
Kolon Düzenleme
ALTER TABLE dept80 MODIFY (last_name VARCHAR2(30));
Kolon Kaldırma
ALTER TABLE dept80 DROP COLUMN job_id;
SET UNUSED
Çok büyük datalar olduğunda alter table dedikten sonra drop kullanarak kolonu kaldırmak istediğimizde işlem yapılana( verinin büyüklüğüne göre 1sa. – 2sa) kadar başka kimse erişim sağlayamaz. Bunu beklemeyi engellemek amaçlı et unused kullanılarak o kolon görünmez hale getirilir. Saniyeler içinde yapılan bu işlem sonucunda sorunsuz olarak transaction işlemlerine devam edilebilir. Ama bu kolon arka tarafta drop edilmemiştir. Veritabanı kullanıcı yoğunluğundan çıktığında tabloyu drop edebiliriz.
ALTER TABLE <table_name> SET UNUSED(<column_name>);
ALTER TABLE <table_name> SET UNUSED COLUMN <column_name>;
Managing constraints
Öncesinde test1 tablosunu oluşturalım.
create table test1 (id number(5),salary number(4));
Constraint Ekleme
alter table test1 add constraint test1_id_pk primary key (id); --id kolonuna primary key ekler
alter table test1 add (mid number(5)); -- mid kolonu ekledik.
alter table test1 add constraint test1_mid_fk foreign key (mid) references test1(id); --mid foreign key yapılır
on delete set null parent key(pk ve fk bağlantısı olan) silinirse child recordlarda bulunan kolonu null yapar. Çalışanları bulunan bir manager silinirse ona null verir.
on delete cascade child recordları da siler.
Deferring constraints
not deferrable initially,immediate
Yazmasak bile default olarak gelir
Bu constraint’in anlamı değiştirilebilir özelliği olmayan ve devreye hemen girecek olandır. Transaction başladığı anda constraint’e uymuyorsa uyarı verir. Deferred oluyorsa transaction biterken constraint kontrolünü gerçekleştirecektir.
Eğer bunların sonucunda tutarsız data varsa otomatik olarak rollback işlemini gerçekleştirir.
create table sales (sales_info number(5) constraint sales_info_ch check(sales_info>10000) not deferrable initially immediate , bonus_info number(3) constraint sales_bonus_ch check(bonus_info>1) deferrable initially deferred);
insert into sales values(15000,3); --sorunsuz ekler
insert into sales values(5000,3); --check(sales_info>10000) olduğundan eklemez
insert into sales values(15000,0); -- sorunsuz olarak ekler
ancak bunu commit et dediğimizde otomatik olarak rollback yapar. nedeni ise check(bonus_info>1) kısmından dolayıdır. önce ekler ancak commit ettiğimizde tutarsız datadan dolayı otomatik rollback yapar.
alter table test1 drop constraint test1_id_pk; alter table test1 drop primary key cascade; /* primary key'i ayrıca bağlı olan foreign keylerle beraber drop et demek istiyoruz. */
alter table test1 disable constraint test1_id_pk; --gerekli kontrolü yapmasını istemiyorsak
alter table test1 enable constraint test1_id_pk; -- tekrar eski haline getirip kontrol etmesini istiyorsak
alter table sales drop column sales_info; --sales tablosundaki sales_info kolonunu drop et.
alter table sales drop column sales_info cascade constraints; --bağlı olduğu constaints'leri de kaldır
alter table sales rename column bonus_info to bonus; -- tablonun adını değiştirir bonus_info yapar.
DROP İşlemleri
DROP oto commit bir işlemdir. Ama buna rağmen çöp kutusunda saklanır.
Flashback ile DROP edilenleri geri getirebiliriz.
drop table sales; --sales tablosunu kaldırır
SELECT * FROM RECYCLEBIN; -- drop edilen işlemleri görebiliriz
flashback table sales to before drop; ile drop edilen tabloyu geri alabiliriz.
Aynı isimli constraint yaratırken sıkıntı çıkmaması için Object_name “BIN$psK8w982QYuWOjpvgoGJUw==$0” şeklinde saklar.
Geri getirilen tablonun/objenin ismini değiştirmek için:
alter table sales rename constraint "BIN$psK8w982QYuWOjpvgoGJUw==$0" to sales_bonus_chk;
create table test2(id number(5), name varchar2(30)); --test2 tablosunu yarattık
insert into test2 values(1,'Ali'); insert into test2 values(2,'İsmail'); insert into test2 values(3,'Korkmaz'); insert into test2 values(4,'Fenerbahçe'); insert into test2 values(5,'Yıkılmaz'); -- dataları insert ettik.
select * from test2
select * from test2 where name= 'Fenerbahçe'; -- sorgumuz için full gider
create index test2_name_ix on test2(name); /* indexi yaratıyoruz. ancak upper olarak tanımlamadığımız için full gidiyor. */
select * from test2 where upper(name)='FENERBAHÇE';
daha sonra drop edip tekrar index oluşturuyoruz.
drop index test2_name_ix;
create index test2_name_ix on test2(upper(name)); -- indexi tekrar oluşturuyoruz ancak upper name olarak
select * from test2 where upper(name)='FENERBAHÇE'; -- bu sefer index'ten gittiğini görüyoruz.
drop table test2 purge; --geri dönüşü olmayacak şekilde siler.
External Tables
create directory ext_dir as 'C:\deneme'; -- veritabanında deneme adında klasör oluşturduk
grant read,write on directory ext_dir to hr; -- zaten olduğu için gerek yoktur ama kullanıcıya özel yetkileri verebiliriz.
Burada yapacağımız işlem ile dışarıda yer alan datayı veritabanımıza alıyoruz. ORACLE_LOADER
create table ext_table(id number(5),name varchar2(30),surname varchar2(30),salary number(5)) organization external(type ORACLE_LOADER default directory ext_dir access parameters(records delimited by newline nobadfile nologfile fields terminated by ',') location('test.txt') )
test.txt isimli dosyamızı aşağıdaki gibi oluşturduktan sonra tablo oluşturma işlemi ile bu dosyayı veritabanımıza tablo olarak ekliyoruz.
select * from ext_table
Gördüğümüz gibi tablomuz eklenmiştir.
ORACLE_DATAPUMP
Bu işlem ise tam tersi olarak içerdeki bir tablonun verilerini dışarı aktarır.
CREATE TABLE emp_ext (employee_id, first_name, last_name) ORGANIZATION EXTERNAL ( TYPE ORACLE_DATAPUMP DEFAULT DIRECTORY ext_dir LOCATION ('emp1.exp','emp2.exp') ) PARALLEL AS SELECT employee_id, first_name, last_name FROM employees;
çalıştırdıktan sonra deneme klasörünün altında dosyaları görebiliriz.