Bu yazımda sizlere veri bütünlüğünün ne olduğunu ve kısıtlayıcı(constraint) kullanarak veri bütünlüğünü nasıl sağladığımızdan bahsetmek istiyorum.
Veri Bütünlüğü Nedir?
Veri bütünlüğünü, ilişkisel veri tabanlarında yanlış verilerin girişini önlemek, tablolara yaptığımız insert, delete ve update işlemlerinde verilerin ilişkili tablolarla uyumluluğunu ve veri bütünlüğünü sağlamak için yapmaktayız.Örnek vermek gerekirse;
Şirket çalışanlarının bilgilerinin tutulduğu bir tablo düşünelim. Bu tabloda;
- ÇalışanID sütununa girilen verilerin benzersiz olması
- Çalışan isim ve soyadlarının 12 karakterden fazla olmaması
- DepartmanID'lerin ilişkili başka tablodaki verilerle bütünlüğün sağlanması gibi.
Veri bütünlüğünü sağlarken bazı yöntemlerden faydalanmaktayız. Bu yöntemler; constraint, rule ve default, trigger, stored procedure ve sql server dışından veri bütünlemesi yapmak için kullanılan programlama dillerinden oluşmaktadır. Bu yöntemler iki ana başlıkta toplanmaktadır.
- Tanımlanabilir Veri Bütünlüğü
- Prosedürel Veri Bütünlüğü
Yukarıdaki resimde görüldüğü üzere yukarıdan aşağıya doğru giderken fonsiyonellik artarken performansta bir düşüş yaşanmaktadır.
Bu yöntemleri seçerken dikkat etmemiz gereken nokta:
Her zaman çözümü en alt katmanda çözmeye çalışmalı, eğer çözülemiyorsa bir üst katmana giderek çözüm aramalıyız.
Bunun nedeni üst katmanlara çıkıldıkça SQL Server'a daha fazla yükün binmesi.
Örnek vermek gerekirse;
Veri bütünlüğünü constraint kullanarak halledebilecek iken trigger kullanmak.
Trigger'lar constraintlerin aksine transaction sonrası devreye girerler. Yani veriler üzerinde bozulma olup olmadığını işlem bittikten sonra kontrol ederler. Eğer veri bütünlüğünde bir bozukluk yoksa hiçbir sorun olmayacaktır. Fakat veri bütünlüğünde bir sıkıntı varsa transaction sonrası bunun için SQL Server'a ekstra bir iş yükleneceğinden gereksiz bir performans kaybına neden olabiliriz.
Tanımlanabilir Veri Bütünlüğü
Constraint'ler rule ve default'lardan oluşan ve oluşturulan nesneleri kullanarak sağlanan veri bütünlüğüdür. Kullanımın basit olması açısından avantajlı olmakla beraber dışarıdan fazla müdahele edilememesi açısındna dezavantajıdır.
Tanımlanabilir veri bütünlüğü 3 esasa dayanmaktadır.
Varlık(Entity) Bütünlüğü
Alan(Domain) Bütünlüğü
Tablodaki sütunların hangi değerleri alabileceği, bu sütunların null değer alıp alamayacağını sağlamaktadır.
Referanssal(Referential) Bütünlük
Primary ve foreign key kullanarak birbirine bağlı tablolardan foreign keyli tablo üzerinde silinmeyen tek bir kayıt dahi olduğu sürece ana tablo üzerinden silme işleminin yapılamayacağını garanti eder. Yani bir anne kaydı silmek için bu kayda ait bütün çocuk kayıtları silmek gerekmektedir.
Constraint
Kelime anlama kısıtlama olan constraintler, veri üzerinde mantıksal sınırlama yapmak için kullanılmaktadır. Constraintler tablo tanımlanırken veya tablo tanımlandıktan sonra oluşturulabilmektedir. Rule ve Default'ların constraint'lerden farkı tablo dışında ayrı bir nesne olarak tanımlanmasıdır. Rule ve Default'un yaptığı her işlemi constraint kullanarak yapabilmekteyiz. SQL Server'ın Rule ve Default'a hala destek vermesinin geriye dönük uyumdan dolayıdır. Rule'un yaptığı işi check constraint, Default'un yaptığı işi default constraintle yapabiliriz.
Primary Key Constraint
- Birincil anahtar kısıtlayıcısıdır.
- Null değer alamaz
- Aynı olmayan değerlerin girilmesini sağlar.
Örnek vermek gerekirse;
musterid sütununa primary key constraint tanımlamak istersek
Constraint pk_musterid primary key (musterid)
Unique Constraint
- Tekil anahtar kısıtlayıcısıdır.
- Tablodaki sütunlara unique değer girmek için kullanılır.
- Boş değer alabilir ve tablodaki birden fazla sütunda kullanılabilir.
Örnek vermek gerekirse;
tcno sütununa unique key constraint tanımlamak istersek
Constraint uq_tcno unique (tcno)
Foreign Key Constraint
- Yabancıl anahtar kısıtlayıcısıdır.
- Bir tablodaki bir sütuna ait verilerin başka bir tablonun belirli bir sütunundan gelmesini denetler.
Constraint fk_musterid foreign key (musterid) references tablo1(musterid)
Delete Update işlemleriyle Foreign Key Kullanımı
İlişkili tablolar üzerinde delete update işlemi yaparken bağlı tablo üzerinde de bazı işlemlerin geçerli olmasını isteyebiliriz. Bunun için aşağıdaki deyimleri kullanmaktayız.
CASCADE: Foreign key tanımlı tabloya aynı aksiyonu uygular.
SET NULL: Foreign key kolonlarını null değerlerine ayarlar.
SET DEFAULT: Foreign key kolonlarını default değerine ayarlar.
Constraint fk_musterid foreign key (musterid) references tablo1(musterid) on delete [castade|set null|set default] on update [castade|set null|set default]
Default Constraint
- Bir sütuna önceden belirlenmiş bir değer atamak için kullanılır.
- insert işleminde geçerlidir.
Örnek vermek gerekirse; tarih bilgisi girilmediğinde tarih sütununa getdate() fonksiyonuyla tarih sütununa veri girişi yapmak istiyoruz.
Constraint df_tarih default (getdate()) for tarih
Check Constraint
- Kontrol kısıtlayıcısıdır.
- Belirlenen formata göre veri girişi yapmak için kullanılır.
Örnek vermek gerekirse; numara sütununa 100 rakamından büyük değerlerin girmesini istediğimizde
Constraint chck_no check (numara>100)
Bu constraintleri silmek istersek bunu drop komutuyla yapmaktayız.
drop constraint contraint_ismi
sp_helpconstraint tablo_adı stored prosedürünü kullanarak tablo üzerindeki tanımlanan kısıtlayıcıları listelemek mümkündür.
Konu ile alakalı videom: