. GirişVeri bütünlüğünü sağlama sorumluluğunu veritabanına taşıma veritabanı ynetimi açısından bir devrim sayılmaktadır. Microsot Sql Server 2000 üzerindeki kısıtlar, veri bütünlüğünü korumamızı sağlayacak kuralları tanımlamamızı sağlar. Kısıtlar, kolonlarda yer almasına izin vereceğimiz değerleri belirleyen kuralları tanımlamamızı ve veri bütünlüğünü korumayı sağlayan standart mekanizmaları sağlar. Veri bütünlüğünü sağlayacak mekanizmalar arasında kısıtlar trigger, stored procedure ve default' lara gore daha çok tercih edilirler. Query Optimizer yüksek performanslı query execution plan oluşturabilmek için kısıt tanımlarını kullanır. rneğin Unique kısıtı tanımlandığında belirtilen kolon için indeks oluşturulur. Oluşturulan bu indeksten zellikle aramalarda yararlanılır. ncelikle veritabanı kısıt tiplerini ve ayrıntılarını inceleyeceğiz. Ortak hedef nedir? Veri bütünlüğünü sağlamak.2. Kısıt TipleriÇok çeşitli kısıt tanımları yapılabilmesine rağmen her bir kısıt aşağıdaki üç kategoriden birisine girer: 'Entity', 'Domain' ve 'Refential Integrity' kısıtları.2.1 Alan KısıtlarıAlan kısıtları bir veya birkaç kolon ile ilişkilidir. Temel amaç kolonun ya da birkaç kolonunun tanımlanan kritere uygun olmasıdır. Tabloya yeni satır eklendiğinde ya da var olan satırlardan birisi update edildiğinde kısıt, tablolardaki başka herhangi bir satırı dikkate almadan gerekli kontrolü yapar. Kolon üzerinde taşınan dataya oadaklanılır. Bu tarz kısıtlara 'Check Constraints', 'Default Constraints', 'Rules' ve 'Defaults' kavramlarını incelediğimiz de daha ayrınıtılı bakacağız. 2.2 Varlık KısıtlarıVarlık kısıtları satırlarla ilgilidir. Bu tarz kısıtlar tüm kolonu dikkate almak yerine zellkle tek bir satır ile ilişkilidir. Her bir satırın belli bir kolona ya da kolonlar topluluğuna gre unique olması, bu tarz kısıtlara verilebilecek en iyi rneklerden birisidir. Bu sayede bir satırın bir kolonundaki bilginin diğer hiç bir satırda bulunmaması garanti altına alınmış olur. Bu konuda daha ayrıntılı bilgiyi Primary key ve Unique kısıtlarını incelediğimizde greceğiz.2.3 Referansal - Bütünlük KısıtlarıReferansal bütünlük kısıtları bir kolondaki bilginin diğer bir kolon ile eşleşmesi zorunluluğunu sağlayarak bütünlüğü korur. Eşleşen kolonlar farklı iki tablonun kolonları olabileceği gibi aynı tablonun kolonları da olabilir. rneğin bir sipariş tablomuz olsun. Bu tablomuzdaki kolonlardan birisi de kredi kartı tipi olsun. Bizim uygulamamız için izin verdiğimiz kredi kartı firmaları;Visa, MasterCard, Discover ve American Express olsun. Referansal bütünlük kısıtları, adına alan tablosu dediğimiz yapıları oluşturmamızı sağlar. Verdiğimiz rneğe gre uygulamamız için alan tablomuz kredi kartları tablosu olacak. Sipariş tablomuzdaki kredi kartı kolonunun bu tablodaki muhtemelen primary key kolonuyla eşleşmesi gerekecek. Dolayısıyla alan tabloları kabul edilecek değerleri içeren tablolarımız olarak da grülebilir. Bu konuda daha ayrıntılı bilgiyi foreign key kısıtlarını grdüğümüzde inceleyeceğiz. 3. Anahtar Kısıtları Veritabanı tasarımı ve ynetiminin kşetaşlarından birisi de anahtarlardır. Hemen hemen tüm veritabanı şirketlerinin veritabanı ynetim sistemlerinde drt farklı anahtar kavramı vardır. Bunlar primary, foreign, alternate ve inversion anahtarlarıdır. İlk üçüne detaylı olarak bakacağız. Inversion anahtarları datayı sıralamak için kullanılan alternatif yollardan sadece birisidir.3.1 Ana Alan KısıtlarıAna alanlar satırın unique belirleyicileridir. Bu anahtarlar unique değerler taşımalıdır ve boş olamaz. İlişkisel veritabanlarındaki nemlerinden dolayı ana alan kısıtları diğer tüm anahtar ve kısıtların temelidir. Bir tablo sadece bir primary key' e sahip olabilir. Primary key eşsizliği garanti altına aldığı gibi satırı belirten bir belirteç olarakta kullanılır. Primary key' leri oluşturmanın iki yolu vardır: CREATE TABLE ve ALTER TABLE komutları. Primary key kolonunun küçük ve integer olması tavsiye edilir. Her bir tablonun bir primary key'si olması çok nemlidir. Şimdi CREATE TABLE komutu içinde nasıl primary key tanımlandığını grelim:USE AccountingCREATE TABLE Employees Var olan bir tablo üzerinde primary key tanımlamak da oldukça kolaydır. Use Accounting ALTER TABLE Customers ADD CONSTRAINT pk_custID PRIMARY KEY Birden fazla kolonda satırı tek başına unique bir şekilde tanımlayabilir. Bu şekilde satırı unique bir şekilde tanımlayan birden fazla kolondan oluşan kombinasyon sayısı da birden fazla olabilir. Bu durumda her bir kombinasyona aday anahtar denir. Bu durumda primary key' yi oluşturabilmek için bu aday anahtarlardan birisi seçilir. rneğin Araba_Parcaları tablosunda hem parca numarası hem de parca ismi aday anahtarlardır, ancak sadece parca numarası primary key olarak secilmiş olabilir. CREATE TABLE Car_Parts( Part_No int PRIMARY KEY, Part_Name char(30), Part_Weight decimal(6,2), Part_Color char(15))Primary key constraint tarafından oluşturulan indeks, non-clustered indesklerin sayısının 249' u, clustered indekslerin sayısının da 1 ' i geçmemesine neden olmaz. Eğer primary key constraint tanımlanırken CLUSTERED ya da NONCLUSTERED denmemişse ve başka hiç bir clustered indeks kullanılmamışsa oluşturulan primary key clustered olur.3.1 Foreign Key KısıtlarıForeign key tablolar arasındaki veri bütünlüğünü sağladığı gibi ilişkili tabloları da gsterir. Bir tabloya foreign key eklediğimizde referans edilen ve referans eden iki tablo arasında bir ilişki kurulur. Bir tablo için foreign key ayarlanmışsa bu tabloya girilecek her kaydın referans edilen tablodaki kayıtla eşleşmesi gerekir. Eğer foreign key olan kolon null değerler alabiliyorsa eşleşmeye bakılmaz. Birkaç rnekle konu daha iyi anlaşılacaktır. Foreign key tanımlama sentaksı aşağıdaki gibidir. FOREIGN KEY REFERENCES <table name> Accounting veritabanımızda Order isimli yeni bir tablo oluşturalım. USE AccountingCREATE TABLE Orders(OrderID int IDENTITY NOT NULL PRIMARY KEYCustomerID FOREIGN KEY REFERENCES Customers , OrderDate smalldatetime NOT NULL, EmployeeID int NOT NULL)Referans edilen kolonun ya primary key ya da üzerinde unique constraint tanımlanmış olması gerektiğini unutmayın. Unique kısıtlarını az sonra inceleyeceğiz. Yukarıda yazdığımız kodun başarılı bir şekilde gerçekleşip gerçekleşmediğinden emin olmak için aşağıdaki komutu kullanabilirisiniz. EXEC sp_helpconstraint <table_name>//So for our Orders it will be:EXEC sp_helpconstraint ordersBu komutu çalıştırdığımızda tablodaki tüm kısıtlar ile ilgili olarak isimlerini, kriterlerini ve durumları hakkında bilgi alırız. Order tablomuz için bir adet primary key bir adet de foreign key olduğunu greceğiz. CLUSTERED kelimesi primary key' den hemen sonra geldiğini greceğiz. Bu belirtilen indeksin clustered yapıda olduğunu gsterir. Bir tabloda birden fazla sayıda foreign key olabilir, ancak bir adet primary key olabilir. Bir tabloda en fazla 253 adet foreign key tanımlanabilir. Bu konuda tek sınırlandırma bir kolon sadece bir adet foreign key' i referans edebilir. Var olan tablolara yeni bir foreign key eklemek de oldukça basittir. Use AccountingALTER TABLE OrdersADD CONSTRAINT Fk_EmpCreateOrders FOREIGN KEY REFERENCES Employee 4. Kendi Kendini Referans Eden Tablo OluşturmaEğer referans edilen kolon ile referans eden kolon aynı tabloda ise ne olacak? Problem değil. Bir tablo aynı anda hem referans edilen hem de referans eden konumunda olabilir. Byle bir tablo oluşturulurken bu kısıtı uygulamadan nce en az bir kayıt bulunması gerekir. Çünkü eklenmeye çalışılan satırın referans eden kolonunun gsterdiği referans edilen satır ortada yoktur. Aşağıadaki rneği inceleyelim. Use AccountingALTER TABLE EmployeesADD CONSTRAINT Fk_EmpManagerFOREIGN KEY REFERENCES Employees Eğer Employees tablosunu da yeni oluşturuyorsak aşağıdaki gibi bir kod yazılacaktır. USE AccountingCREATE TABLE Employees Eğer employee tablosunu silmeye çalışırsak error mesajı alırız. Order tablosu ile Employee tablosu arasında bir referans kurduğumuz için bu referansı kaldırmadan employee tablosunu silemeyiz. 5. Otomatik Güncellemeler ve SilmelerOtomatik silme ve güncellemeler "Cascading" olarak bilinmektedir. İçerisinde karşılığı olmayan bir foreign key bulunduran bir satırı insert edemeyiz. ON DELETE cümleciği içerisinde referans edilen bir kolon bulunan satırın silinmeye çalışılması sırasında nasıl davranılacağını belirtmek için kullanılır. 2 opsiyonludur.1. NO ACTION - Bu durumda silme işlemi başarısızlıkla sonuçlanır ve error mesajı alınır.2. CASCADE - Bu durumda kendisine referans veren tüm satırlar ile birlikte silme işlemi gerçekleşir. ON UPDATE cümleciği bir foreign key tarafından referans edilen bir kolonun update olması sırasında nasıl bir davranışta bulunulması gerektiğini ayarlamak için kullanılır. Aynı şekilde "No action" ve "Cascade" opsiyonları vardır. Aşağıdaki kod bu kavramları daha iyi açıklamaktadır. CREATE TABLE Order_Parts(Order_NO int, Part_NO int; FOREIGN KEY REFERENCES Car_Parts ON DELETE NO ACTION, qty_ordered int)GOOrder_Parts tablosu ile Car_Parts tablosu arasında bir ilişki tanımlanmıştır. Genellikle Order_Parts tablosu ile Orders tablosu arasında da bir ilişki olur. Ancak rneğin bastiliği açısından bunu gerçekleştirmeyelim. Foreign key kolonuna null dışında bir değer girildiğinde bunun mutlaka diğer kolonda bir karşılığı olmalıdır. Foreign key kısıtları sadece aynı server üzerindeki aynı varitabanı üzerinde bir kolona referans verebilir. Diğer durumlar için cross-database referential integrity, trigger mekanizması yardımıyla kullanılmalıdır. Foreign key' ler aynı tablodaki başka bir kolonu da referans edebilir . References cümleciği ile sadece bir kolona referans verilebilir. Bir kolon birden fazla kolona referans veremez. Ve referans verilen kolon da aynı veri tipinde olmalıdır. Table seviyesinde ise referans veren kolon sayısı ile referans edilen kolon sayısı aynı olmalıdır. Referans eden ve edilen kolonlar aynı veri tipine haiz olmalıdır. Referans edilen ve eden kolonlar timestamp veritipinde ise CASCADE cümleciği kullanılmamalıdır. Referans edilen ve eden tablolar arasında CASCADE ve NO ACTION opsiyonlarına gore ilişki kurulabilir. Eğer Sql Server No action ile karşılaşırsa işlemi iptal ederek error mesajı dndürür. Bu arada daha nceden yapılmış cascade işlemleri varsa onlar da rollback olur. Silme işlemleri biraz farklıdır. Eğer bir silme işlemi sırasında cascade ve no action' lar varsa ncelikle cascade işlemleri gerçekleştirilir. Foreign key kısıtları temporarily olarak oluşturulmuş tablolar üzerinde gerçeklenemez. Referans edilen kolon ya primary key ya unique kısıtı ya da unique indeksi içinde yer almak zorundadır. 6. Unique KısıtlayıcılarEn kolay ynetilebilen ve primary key' lere benzeyen bir kısıttır. Belirtilen kolonun ya da kolonlar toplulugunun taşıdığı değerlerin unique olmasini saglar. Sıklıkla bu kısıtlara alternatif anahtarlar da denir. Alternatif anahtarlar tablodaki satırı tanımlayan unique bir belirteç olarak düşünülmez. Unique kısıtlar birden fazla olabilir. Bir unique kısıt uygulandığında ilgili kolondaki tüm değerlerin unique olması gerekir. Tersi durumlarda SQL Server bir error mesajı dndürür. Primary key' lerdeki durumun tersine unique key kolonlarında Null değerler girilebilir. İstemiyorsak zellikle belirtmeliyiz. Ancak null değerlere izin versek bile unique' liğin bozulmaması açısından en fazla bir adet null değer barındırılabilir. Normalde bir null başka bir null' a eşit değildir. Şimdi Accounting veritabanında shipment adında bir tablo oluşturalım. USE AccountingCREATE TABLE Shipment( ShipperID int IDENTITY NOT NULL PRIMARY KEY, ShipperName varchar(30) NOT NULL, Address varchar(25) NOT NULL, City varchar(25) NOT NULL, State varchar(2) NOT NULL, Zip varchar(10) NOT NULL, Phone varchar(14) NOT NULL UNIQUE)Benzer şekilde var olan bir tabloya unique kısıtlayıcı eklemek de oldukça basittir. Use AccountingALTER TABLE EmployeesADD CONSTRAINT Ak_EmpSSN UNIQUE 7. Kontrol KısıtlarıKontrol kısıtları ile ilgili en güzel şey belirli bir kolona bağlı olmamaktır. Kontrol kısıtlarını belirli bir kolona da uygulayabiliriz. Ancak kontrol kısıtları nemini daha çok tablo ynelimli yapısından almaktadır. Bir kolondaki değerin geçerliliğini başka bir kolonla karşılaştırarak elde edebilmemize olanak sağlar. Bu noktada nemli olan aynı satırın kolonları olmasıdır. Kontrol kısıtlarının belli başlı tipik kullanımları ile ilgili rnekler aşağıda gsterilmiştir.1. Ay kolonunu sınırlandırmak SQL komutunda "Between 1 and 12"2. Amerikan Sosyal Güvenlik Numarası formatı SQL komutunda - 3. Şehir kolonu için girilen şehrin geçerliliğini kontrol etme, CHECK IN Aşağıdaki rnekte min_lvl kolonunun 10'a eşit ve büyük olması, max_lvl kolonunun da 250' ye eşit ya da küçük olması kontrolleri için gerekli kontrol kısıtları uygulanmıştır. CREATE TABLE Jobs( job_id smallint IDENTITY(1,1) PRIMARY KEY CLUSTERED, job_desc varchar(50)NOT NULL, min_lvl tinyint NOT NULL CHECK (min_lvl >= 10), max_lvl tinyint NOT NULL CHECK (max_lvl <= 250))Bu şekilde min_lvl kolonuna 10' dan küçük max_lvl kolonuna da 250' den büyük değerler girildiğinde error alınacaktır.7.1 Var olan bir tablo üzerinde yeni kontrol kısıtı eklemeCustomer isimli tablomuzun DateInSystem isimli kolonunun değeri satır ekleme ya da güncelleme sırasında sistemdeki tarihtir. Şimdi bu kolona bir kontrol kısıtı ekleyelim. Bu kolona işlem yapılırken sistem tarihinden daha büyük bir tarihin girilmesini engelleyelim. Use AccountingALTER TABLE CustomersADD CONSTRAINT Chk_DateSys CHECK (DateInSystem <= GETDATE Bir kolon için birden fazla sayıda kontrol kısıtı tanımlanabilir, hatta durumlar or veya and' lenebilir. Bir kolon için birden fazla kontrol kısıtı tanımlanmışsa bunların kontrol edilme sırası oluşturulma sıraları ile aynıdır. Kontrol kısıtları içerisinde başka tabloları kullanamayız ve mutlaka boolean bir sonuç dnmelidir. Kolon seviyesindeki kontrol kısıtları sadece kolona referans verebilirken, tablo seviyesindeki kontrol kısıtları tablo içerisindeki her kolona referans verebilir. Kontrol kısıtları ve kurallar aynı fonksiyonelliğe sahiptir. Bir kolon için birden fazla kontrol kısıtı ve bu kolonu da ilgilendiren kural tanımı yapılmışsa bütün hepsi değerlendirilir. 8. Varsayılan KısıtlarDiğer tüm kısıtlar gibi, varsayılan kısıtlar da tablo tanımının bir parçası olmuş durumdadır. Bir kolona varsayılan kısıt eklendiğinde, satır ekleme ve güncellemeler de bu kolonun boş bırakılması durumunda nasıl davranılacağını tanımlanmış olan varsayılan kısıt belirler. Varsayılan değer olarak string bir ifade(3000$) girilebileceği gibi çeşitli sistem tanımlı değerler de (GETDATE girilebilir. Aşağıdaki rneği inceleyelim. USE AccountingCREATE TABLE Shippers( ShipperID int IDENTITY NOT NULL PRIMARY KEY, ShipperName varchar(30) NOT NULL, Address varchar(25) NOT NULL, DateInSystem smalldatetime NOT NULL DEFAULT GETDATE Oluşturulan bu tabloya şyle bir ekleme yapılıyor. Insert into Shippers Values Aşağıdaki komutu çalıştıralım. Select from Shippers;Bu sorgunun sonucunda aşağıdaki sonuç alınır. ShipperID ShipperName DateInSystem 1 UPS 2003-12-25:23:26:00Satır ekleme sırasında DateInSystem kolonuna bir değer girmediğimiz için belirttiğimiz varsayılan kısıt devreye girerek sistem tarihini ilgili kolona ve satıra yazmıştır.7.1. Var olan bir tablo üzerinde yeni varsayılan kısıt eklemeJobs tablosunda bulunan job_desc kolonu için varsayılan kısıt olarak string bir tekst yapalım. Aşağıdaki kodu inceleyelim. ALTER TABLE JobsADD CONSTRAINT CnDef_jobsDEFAULT 'New Position - title yet to be assigned' FOR job_desc;Şimdi employee tablomuza benzer bir tablo oluşturarak şu ana kadar ğrendiklerimizi grelim. CREATE TABLE employee2( emp_id varchar(7) CONSTRAINT PK_emp_id PRIMARY KEY NONCLUSTERED CONSTRAINT CK_emp_id CHECK (emp_id LIKE' ' or emp_id LIKE ' - ', fname varchar(20) NOT NULL, minit char(1) NULL, lname varchar(30) NOT NULL, job_id smallint NOT NULL DEFAULT 1 REFERENCES jobs , job_lvl tinyint DEFAULT 10, hire_date datetime NOT NULL DEFAULT (getdate Yukarıdaki script ile oluşturulan tablo da emp_id kolonu primary key konumundadır. Emp_Id kolonundaki verinin de şu şartları sağlamasını istedik. İlk üç ya da iki hane kişinin ismi ve soyisminin başharfleri ondan sonra gelen üç hane ise 100-999 arasında bir sayıyı destekleyecek şekilde olacaktır. Son hane ise cinsiyet hanesi olup M ya da F içerecektir. Job_Id kolonu Jobs tablosunun Job_Id kolonuna referans veriyor. Bu yüzden bir foreign key kısıtı eklendi. Job_lvl kolonuna varsayılan kısıt eklenmiş ve değer 10 yapılmıştır. Bu kolona veri girilmediği takdirde 10 değeri varsayılan bir değer olarak eklenecektir. Benzer şekilde sistem tarihi de varsayılan kısıt değeri olarak hire_date kolonuna eklenmiştir. zetle şimdiye kadar SQL Server 2000' deki kısıt tiplerini, alt sınıflarını, spesifik kısıtlar ile tablo oluşturmayı, var olan tablolarda kısıtlar ile ilgili modifikasyonları inceledik. Artık bundan sonrası size kalmış. Kendinizi bu konuda rnek kodlar yazarak ustalaştırın.8. Kaynakhttp://www.aspfree.com/c/a/Database-Code/Constraints-In-Microsoft-SQL-SERVER-2000