8/19/2005

SQL Server - Referential Integrity Meselesi

Relational database'lerde tablolar arasındaki mantiksal ağları kurmak ve uygulamaya koymak temel gereksinimler arasındadır. Bu tür mantıksal bağlara sahip veriler için bu veri referantial integrity'e(bütünlüğü bulunan-tam) sahip veri deniyor.

Peki Referantial Integrity nedir?
Bir tablo başka bir tablo tarafından referans olarak gösterilebilir ve bu durumda referans gösteren tablodaki değerler referans gösterilen tablodaki verilerle eşit olmak zorundadır. Bazen bu tür ilişkiye parent-child(aile-çocuk) ilişkisi denir.

SQL Server referantial integrity sizin belirleyeceğiniz foreign key'ler aracılığıyla otomatik olarak aktif hale getirebilir.

Örneğin Siparisler ve SiparisAyrintilari şeklinde 2 adet birbiriyle ilişki halinde olan tablomuz bulunsun. Siparişler tablosunda SiparişID'si Primary Key olacak ve her siparişi bu key'e bakarak ayrıştırabilmemizi sağlayacaktir. (Not: Primary Key'ler eşsiz(unique) olmak zorundadır.)
SiparişAyrıntıları tablomuzdada SipairsID'si bulunacak ancak bu sütün bu tabloda Foreign Key olarak Siparişler tablosunu referans olarak gösterecek ve Siparişler tablosundaki değerlerle eşleştirme sağlayacak. Bu örnekte Siparişler tablosu Referans gösterilen, SiparişAyrıntıları tablosu ise referans gösterendir.

Eğer Siparişler ve SiparişAyrıntıları tabloları arasında bir foreign key constraint oluşturursanız, SQL Server bu iki tabloda yapılan her modifikasyonu inceleyerek bu tablolardan birinin tablolar arasındaki ilişkiyi bozup bozmadığına bakacaktir.

Örneğin, Siparişler tablosundan bir siparişi silmeye kalkışırsanız ve de silinmeye calışılan siparişe ait SiparişID'si hala SiparişAyrıntıları tablosunda bulunuyorsa, silme işlemi referential integrity constraint'e sebep olacaktir. Siparişler tablosunda SiparişID'si sütununda yapılan bir değişiklik SiparişAyrıntıları tablosunda değiştirilmezse yine bir ihlal şeklinde değerlendirilecektir. SQL Server SiparişAyrıntıları tablosuna yapılan bütün yeni girişleri kontrol ederek SiprisID'sinin Siparişler tablosunda da bulunduğunu kontrol eder.

Gelecek makalede kod örnekleriyle ayrıntılı olarak bu konunun devamını işleyeceğim...