Üzerlerinde parent-child ilişkisi tanımlanmış olan tablolar sayesinde tablolardaki verinin bütünlüğünü korumak daha kolay olabilir, örneğin motorlu taşıtların fiyatlarının tutulduğu bir parent tablo üzerinden motorsikletlerin marka ve modellerinin tutulduğu bir child tabloya parent-child ilişkisi tanımlanabilir. Bu şekilde seçilen marka ve modeldeki motorsikletin fiyatına parent tablo üzerinden ulaşılabilir. Bu yapıda Parent-Child ilişkisi kaldırılmadan parent kayıt silinemeyeceğinden her motorsiklet için mutlaka fiyat kaydının olması garanti altına alınmış olacaktır. Böyle bir yapı kurulmuş ise ve eğer veri silinmek isteniyorsa öncelikle child kayıtlar silinmeli ve daha sonra o kayıtlara ait olan parent kayıtlar silinmelidir. Aksi taktirde parentten silme işlemi yapıldığı zaman foreign key constraint hatası alınacaktır.
Ekleme işleminde ise öncelikle parent tabloda fk ilişkisi tanımlanmış alanın verisi girilmiş olmalıdır, daha sonra bu alanla ilişkili child kayıtlar eklenebilecektir. Bu yapı veri ekleme ve silme işlemlerini kısıtlar gibi görünse de tablo üzerindeki veri bütünlüğünü korumaktadır. Ayrıca üzerinde parent-child ilişkisi tablolarda parent tablodaki verinin silinmesi ile onunla ilişkili child kayıtların silinmesini sağlayacak olan bir 'cascade deletion' yapısı mevcuttur. Cascade deletion, seviyeli silme işlemi, parent-child ilişkisinin oluşturulduğu foreign key üzerine tanımlanır.
Aşağıdaki örneklerde parent-child ilişkisinin nasıl kurulacağı, cascade deletion tanımlarının nasıl yapılacağı, üzerine önceden foreign key tanımlamaları yapılmış olan tablolarda cascade deletion işlemi için yapılacak olan değişiklikler basitçe gösterilmiştir.
Öncelikle örnek bir bayi tablosu oluşturalım. Bayi tablosu üzerinde bayi_id ve bayi_adi alanlarını primary key olarak belirleyelim.
CREATE TABLE bayi
( bayi_id numeric(10) not null,
bayi_adi varchar2(50) not null,
iletisim_adi varchar2(50),
CONSTRAINT bayi_pk PRIMARY KEY (bayi_id, bayi_adi)
);
Daha sonra urunler tablosunu oluşturalım ve bu tablo üzerinde bayi tablosuna foreign key olacak alanları belirleyelim.
CREATE TABLE urunler
( urun_id numeric(10) not null,
bayi_id numeric(10) not null,
bayi_adi varchar2(50) not null,
CONSTRAINT fk_bayi
FOREIGN KEY (bayi_id, bayi_adi)
REFERENCES bayi(bayi_id, bayi_adi)
);
Şu anda urunler tablosu ile bayi tablosu arasında bayi_id ve bayi_adi alanlarına göre ilişki kurmuş durumdayız. Artık bayi tablosunun ürünler tablosunun parent tablosu olduğunu ve aynı zamanda urunler tablosunun bayi tablosunun child tablosu olduğunu görebiliriz.
Oluşturmuş olduğumuz tablolara veri ekleyelim:
Öncelikle parent tablo olan bayi tablosuna ekleme yapıyoruz.
INSERT INTO BAYI (
BAYI_ID, BAYI_ADI, ILETISIM_ADI)
VALUES ( 1,'bayi1','bayi1_iletişim_adresi');
INSERT INTO BAYI (
BAYI_ID, BAYI_ADI, ILETISIM_ADI)
VALUES ( 2,'bayi2','bayi2_iletişim_adresi');
INSERT INTO BAYI (
BAYI_ID, BAYI_ADI, ILETISIM_ADI)
VALUES ( 3,'bayi3','bayi3_iletişim_adresi');
INSERT INTO BAYI (
BAYI_ID, BAYI_ADI, ILETISIM_ADI)
VALUES ( 4,'bayi4','bayi4_iletişim_adresi');
COMMIT;
--1 row created.
--1 row created.
--1 row created.
--1 row created.
--Commit complete.
Daha sonra child tablo olan urunler tablosuna ekleme yapıyoruz.
INSERT INTO URUNLER (
URUN_ID, BAYI_ID, BAYI_ADI)
VALUES ( 01,1,'bayi1');
INSERT INTO URUNLER (
URUN_ID, BAYI_ID, BAYI_ADI)
VALUES ( 02,2,'bayi2');
INSERT INTO URUNLER (
URUN_ID, BAYI_ID, BAYI_ADI)
VALUES ( 03,3,'bayi3');
INSERT INTO URUNLER (
URUN_ID, BAYI_ID, BAYI_ADI)
VALUES ( 04,4,'bayi4');
COMMIT;
--1 row created.
--1 row created.
--1 row created.
--1 row created.
--Commit complete.
Kontrollü bir şekilde önce parent sonra ise chil tabloya ekleme yaptığımız için herhangi bir hata ile karşılaşmadık.
Fakat urunler tablosuna bayi_id'si 5 ve bayi_adi bayi5 olan bir kaydı eklemeye çalıştığımızda ORA-02291 kodlu hata ile karşılaşırız. Çünkü parent tabloda bulunmayan bir kayıdı onun child tablosuna insert etmeye çalışıyoruz.
ORA-02291: integrity constraint (CCSOWNER.FK_BAYI) violated - parent key not found
Tam tersi olacak şekilde parent tablo olan URUNLER tablosundaki URUN_ID = 1 olan kayıdı silmeye çalıştığımızda da aşağıdaki gibi bir hata ile karşılaşırız. Parent tablodan silme yaparken child tablodan da silmemiz grektiği için veri bütünlüğü korunmuş olur.
ORA-02292: integrity constraint (MDSTAGE.FK_BAYI) violated - child record found
Bahsedildiği şekilde veri bütünlüğünü korumak bazı çalışmalarda büyük ölçüde istediğimiz bir özelliktir fakat silme yaparken daha büyük bir yapıda hangi tablonun hangisinin parenti olduğu gibi sorunlarla uğraşmak istemeyiz, bunun için parent-child ilişkisindeki yapılarda cascade delete (kademeli silme) özelliğini kullanabiliriz.
Kademeli silme özelliği ile bir parent tablodan veri silindiğinde otomatik olarak tüm bağlı child tablolardaki veri de silinir, ver bu şekilde veri bütünlüğü korunur.
Cascade deletion yapısı için ilişkiyi kurduğumuz ikincil anahtar (foreign key) üzerinde ON DELETE CASCADE tanımı yaparız. URUNLER tablosunu aşağıdaki gibi yeniden düzenleyecek olursak, cascade deletion yapan bir yapıyı elde etmiş oluruz.
CREATE TABLE urunler
( urun_id numeric(10) not null,
bayi_id numeric(10) not null,
bayi_adi varchar2(50) not null,
CONSTRAINT fk_bayi
FOREIGN KEY (bayi_id, bayi_adi)
REFERENCES bayi(bayi_id, bayi_adi)
ON DELETE CASCADE
);
veya bir tablo üzerinde önceden oluşturulmuş olan anahtar alanlarda alter table işlemi ile cascade deletion yapısı oluşturabiliriz.
ALTER TABLE urunler
add CONSTRAINT fk_bayi
FOREIGN KEY (bayi_id )
REFERENCES supplier(bayi_id)
ON DELETE CASCADE;
Kendi kullandığım bazı notları hızlı erişim sağlayabilmek için bu sayfaya ekliyorum, bilgi paylaştıkça güzeldir (:
26 Haziran 2009 Cuma
18 Haziran 2009 Perşembe
Tablo üzerindeki çiftleyen, duplicate, tekrarlayan, mükerrer kayıtların bulunması.
Tablo üzerinde bir alandaki duplicate, çiftleyen, tekrarlayan, mükerrer kayıtları bulmak ve o kayıt için kaç tane tekrarlayan olduğunu listelemek için aşağıdaki cümleyi kullanabilirsiniz.
Having yapısı içerisindeki >1 değerini değiştirerek, sadece 2 den fazla tekrar edenler (>2) gibi değerler için de kullanabilirsiniz.
SELECT kayit_tarihi, COUNT (kayit_tarihi) AS toplam_kayit_sayisi
FROM users
GROUP BY kayit_tarihi
HAVING (COUNT (kayit_tarihi) > 1)
Having yapısı içerisindeki >1 değerini değiştirerek, sadece 2 den fazla tekrar edenler (>2) gibi değerler için de kullanabilirsiniz.
SELECT kayit_tarihi, COUNT (kayit_tarihi) AS toplam_kayit_sayisi
FROM users
GROUP BY kayit_tarihi
HAVING (COUNT (kayit_tarihi) > 1)
Etiketler:
bulunması,
çift,
çiftleyen,
duplicate,
kayitların,
tekrarlayan,
tekrarlı
17 Haziran 2009 Çarşamba
Örnek DDL, DCL, DML ve TCL komutları ve bu sorgu tipleri arasındaki farklar.
DDL
Data Definition Language (DDL) cümleleri veritabanı veya şema yapıları tanımlamak için kullanılırlar.
Örneğin:
• CREATE - veritabanında objelerin yaratılması.
• ALTER - değişiklik yapmak üzere bir yapıyı kullanmak.
• DROP - objenin veritabanından kaldırılması.
• TRUNCATE - bir tablonun içerisindeki tüm kayıtların silinmesi.
• RENAME - bir objenin isminin değiştirilmesi.
DML
Data Manipulation Language (DML) cümleleri veritabanı objelerine ait verinin gösterilmesi, silinmesi, güncellenmesi, birleştirilmesi, değiştirilmesi, yönetilmesi gibi işlemler için kullanılırlar.
Örneğin:
• SELECT - veritabanından veri çekmek, listelemek, göstermek.
• INSERT - tablo içerisine veri eklemek.
• UPDATE - tablo içerisindeki veriyi güncellemek, değiştirmek.
• DELETE - tablodaki verilerin silinmesi.
• MERGE - UPSERT operasyonunun yapılması, (insert etmek, eğer insert hata alırsa update etmek işlemi).
• CALL - bir PL/SQL veya Java programının çalıştırılması.
• LOCK TABLE - kontrol altında tutma işlemleri.
DCL
Data Control Language (DCL) cümleleri yetki tanımlama gibi kontrol unsurlarını içeren cümlelerdir.
Örneğin:
• GRANT - kullanıcıya veritabanı üzerinde yetki tanımlama
• REVOKE - yetkilerin iptal edilmesi
TCL
Transaction Control (TCL) cümleleri DML cümleleri tarafından yapılan işlemlerin mantıklı bir şekilde gruplanmasını ve kontrol edilmesini sağlar.
Örneğin:
• COMMIT - işlem bittiğinde kayıt edilmesi.
• SAVEPOINT - daha sonra rollbak yapılmak üzere bir nokta belirlenmesi
• ROLLBACK - veritabanını en son commit edilen hale getirmek için yapılan işlemlerin iptal edilmesi
• SET TRANSACTION - Transaction ayarlarının değiştirilmesi, rollback segmentlerinin belirlenmesi gibi işlemler.
Data Definition Language (DDL) cümleleri veritabanı veya şema yapıları tanımlamak için kullanılırlar.
Örneğin:
• CREATE - veritabanında objelerin yaratılması.
• ALTER - değişiklik yapmak üzere bir yapıyı kullanmak.
• DROP - objenin veritabanından kaldırılması.
• TRUNCATE - bir tablonun içerisindeki tüm kayıtların silinmesi.
• RENAME - bir objenin isminin değiştirilmesi.
DML
Data Manipulation Language (DML) cümleleri veritabanı objelerine ait verinin gösterilmesi, silinmesi, güncellenmesi, birleştirilmesi, değiştirilmesi, yönetilmesi gibi işlemler için kullanılırlar.
Örneğin:
• SELECT - veritabanından veri çekmek, listelemek, göstermek.
• INSERT - tablo içerisine veri eklemek.
• UPDATE - tablo içerisindeki veriyi güncellemek, değiştirmek.
• DELETE - tablodaki verilerin silinmesi.
• MERGE - UPSERT operasyonunun yapılması, (insert etmek, eğer insert hata alırsa update etmek işlemi).
• CALL - bir PL/SQL veya Java programının çalıştırılması.
• LOCK TABLE - kontrol altında tutma işlemleri.
DCL
Data Control Language (DCL) cümleleri yetki tanımlama gibi kontrol unsurlarını içeren cümlelerdir.
Örneğin:
• GRANT - kullanıcıya veritabanı üzerinde yetki tanımlama
• REVOKE - yetkilerin iptal edilmesi
TCL
Transaction Control (TCL) cümleleri DML cümleleri tarafından yapılan işlemlerin mantıklı bir şekilde gruplanmasını ve kontrol edilmesini sağlar.
Örneğin:
• COMMIT - işlem bittiğinde kayıt edilmesi.
• SAVEPOINT - daha sonra rollbak yapılmak üzere bir nokta belirlenmesi
• ROLLBACK - veritabanını en son commit edilen hale getirmek için yapılan işlemlerin iptal edilmesi
• SET TRANSACTION - Transaction ayarlarının değiştirilmesi, rollback segmentlerinin belirlenmesi gibi işlemler.
Oracleda procedure trigger gibi db objeleri içinde arama yapmak.
Oracle da prosedürler, triggerlar, fonksiyonlar, şema sahipleri gibi obje tipleri içerisinde arama yapabilmek veya belli bir şemaya ait içeriği listeleyebilmek için 'all_source' tablosunu kullanabiliriz. Bu tabloda objeler kullanıcı(owner), isim(name), tip(type), objede kelimenin geçtiği satır(line), obje içeriği(text) gibi özellikleriyle birlikte tutulmaktadır.
Buna göre prosedürler içerisinde arama yapabilmek için aşağıdaki sorgu kullanılabilir.
select * from all_source
where name = '' and type = 'PROCEDURE'
order by line;
Yine aynı tablo kullanılarak bir tablonun hangi objeler tarafından kullanıldığını belirleyebilmek için objelerin içeriklerinde aşağıdaki gibi aratma yapabiliriz.
select * from all_source
where text like '%%'
order by name;
Eğer aramayı belirli bir kullanıcı için kısıtlamak istiyorsak 'all_source' tablosu yerine login olduğumuz kullanıcıya ait objeleri tutan 'user_source' tablosunu kullanabiliriz. Veya 'all_source' tablosunda owner alanı için bir değer belirleyerek sorgumuzun where kısmına ekleyebiliriz.
Buna göre prosedürler içerisinde arama yapabilmek için aşağıdaki sorgu kullanılabilir.
select * from all_source
where name = '
order by line;
Yine aynı tablo kullanılarak bir tablonun hangi objeler tarafından kullanıldığını belirleyebilmek için objelerin içeriklerinde aşağıdaki gibi aratma yapabiliriz.
select * from all_source
where text like '%
order by name;
Eğer aramayı belirli bir kullanıcı için kısıtlamak istiyorsak 'all_source' tablosu yerine login olduğumuz kullanıcıya ait objeleri tutan 'user_source' tablosunu kullanabiliriz. Veya 'all_source' tablosunda owner alanı için bir değer belirleyerek sorgumuzun where kısmına ekleyebiliriz.
Etiketler:
arama,
database objeleri,
db objeleri,
ORACLE,
veritabanı objeleri
Kaydol:
Kayıtlar (Atom)
Popüler Yayınlar
-
NVARCHAR ve VARCHAR çok fazla kullandığımız veri tipleri arasında, fakat geçenlerde bir sohbet sırasında iki veri tipi arasındaki farkları t...
-
Kullandığımız Oracle versiyonu bazı özelliklerin kullanılıp kullanılmması açısından önemli olabilir, yeni eklenen özellikleri eski versiyonl...
-
Üzerlerinde parent-child ilişkisi tanımlanmış olan tablolar sayesinde tablolardaki verinin bütünlüğünü korumak daha kolay olabilir, örneğin ...
-
DDL Data Definition Language (DDL) cümleleri veritabanı veya şema yapıları tanımlamak için kullanılırlar. Örneğin: • CREATE - veritabanında ...
-
Tablo üzerinde bir alandaki duplicate, çiftleyen, tekrarlayan, mükerrer kayıtları bulmak ve o kayıt için kaç tane tekrarlayan olduğunu liste...
-
Soru: Oracle da string bir değerin alfanumerik karakterler içerip içermediğini nasıl test ederiz? Cevap: Bir stringi alfanumerik karakterl...
-
Merhaba, Bu yazı sql plus marifetlerini kullanarak iki veritabanı arasında veri kopyalama işlemini nasıl yapabileceğiniz hakkında bilgiler i...
-
Oracle/PLSQL: Oracle Sistem Tabloları Bütün gerçekten ilişkisel olan sistemler sistem bilgilerini saklayan alanlara sahiptir. Sistem ...
-
Gittikçe büyüyen ve data yükü artan tablolar üzerinde sorgu çalıştırmak veya tablo bakımına ait diğer işlemleri gerçekleştirmek zamanla ...
-
MS-SQL kullanmış olanlar bilirler auto increment kolon oluşturmak iki tıklama kadar kolaydır fakat ORACLE a gelince işler biraz farklı yürüy...