8/22/2005

SQL Server - Referential Integrity Meselesi - 2

Bir önceki makalede Referential Integrity'nin ne olduğunu ve SQL Server'in Referential Integrity konusu hakkında nasıl bir tutum izlediğini özetlemiştik. Bu devam niteliği taşıyan makalede ise bu konuya kod örneğiyle bakacağız.

SiparişAyrıntıları tablosunu yaratırken kullanacağımız SQL syntax'ında şu şekilde Siparişler tablosunu referans göstereceğiz.

CREATE TABLE SiparisAyrintilari(SiparisID int PRIMARY KEY CONSTRAINT FK SiparisAyrintilari Siparisler FOREİGN KEY REFERENCES Siparisler (SiparisID) ON DELETE no action ON UPDATE CASCADE, Ayrintilar varchar(100))

SQL Server 2000, veri modifikasyonu işlemleri esnasında kullanıcının veriyi değiştirmesini engellemek yerine bazı farklı seçenekler de sunmaktadır.
UPDATE VE DELETE işlemleri için 4 çeşit değişik eylem opsiyonu bulunmakta. Bunlar;

NO ACTION (Modifikasyonu engerller)
CASCADE (Referens gösteren tablodaki bütün ilişkili değerleri de modifiye eder. Silme işlemi de dahil)
SET DEFAULT (Modifikasyona izin verir ancak referans gösteren tablodaki bütün foreign key değelerini bir default değere eşitler.)
SET NULL (Modifikasyona izin verir ancak referans gösteren tablodaki bütün foreign key değelerini NULL'a eşitler.)

Örneğin Siparisler tablosundan herhangi bir siparişin silinmesi durumunda SiparisAyrıntıları tablosundan da o siparişle ilgili herşeyin silinmesini sağlayabilirsiniz. Bu yapmak için Sipariş Ayrtınları Tablosunda DELETE opsiyonu üzerinde CASCADE opsiyonunu aktif hale getirmeniz gerekir. Bu şekilde Siparişler tablosundaki verileri herhangi bir veri kısıtlamasına(data constraint) sebep olmadan silebilirsiniz.

Not: Bu işlemler sadece referans gösterilmiş olan tablo üzerinde yapılacak olan değişiklikler için geçerlidir. Referans gösteren tablo üzerinde yapacağınız değişiklikler için tek bir opsiyonunuz var o da foreign key sütununa girilecek verinin referans gösterilmiş olan tablodaki değerlerle denk olması. Aksi takdirde SQL Server yapılmak istenen değişikliğe izin vermeyecektir.

Foreign Key Constraint'ini ihlal etmeye kalkıştığınızda göreceğiniz hata mesajlarından bazı örnekler;

INSERT Denemesi Örneği Hata Mesajı;
INSERT statement conflıcted with COLUMN FOREIGN KEYconstraint 'FK SiparisAyrintilari Siparisler SiparisID'. The conflict occurred indatabase 'pubs', table 'Siparisler', column 'SiparisID'.
DELETE Denemesi Örneği Hata Mesajı;
DELETE statement conflicted with COLUMN REFERENCE constraint'FK SiparisAyrintilari Siparisler SiparisID'. The conflict occurred in database 'pubs', table 'SiparisAyrintilari', column 'SiparisID'.

Önceki Referential Integrity makalesi
Önceki makaleden baslamanizi oneririm...