6 Mayıs 2012 Pazar

MS SQL 'de With Check Option

Merhaba arkadaşlar.
Sql Sever da bazı durumlarda, "view" nesnelerini tanımlarken, gövdesinde "where" anahtar sözcüğüyle bir kriter belirtmiş olabiliriz. Böyle bir "view" nesnesini kullanırken de "view" üzerinden tablolarımıza "insert" işlemi gerçekleştirebiliriz. Genelde piyasada şubelere, veritabanında bazı tabloların bazı kolonlarını görme kısıtlaması getirmek için, bir "view" verilir. Şube ne gibi bir işlem yapmak isterse bu "view" üzerinden gerçekleştirmesi istenir. İşte arkadaşlar eğer bir "view" nesnesi oluşturulurken "where" koşulu kullanılmışsa, o "view" üzerinden tablolara bir "insert" işlemi gerçekleştirilecekse ve bu "insert" işleminin sadece "where" koşuluna göre gerçekleşmesi isteniyorsa, "view" nesnesini tanımlarken "where" koşulundan sonra "with check option" parametresini kullanmak gerekir. Çok basit bir kullanımı vardır. "Where" kriterinden sonra "with check option" yazılır.

Örneğin bir arkadaşlık siteniz var ve sadece İzmir içinden üye kabul ediyor. Bunun için bir "view" yazalım. Öncesinde "Kisi" adında bir tablo oluşturalım. "Id (int), Ad (nvarchar), Sehir ((nvarchar)" kolonlarından meydana gelsin.

USE Deneme
GO
CREATE VIEW IzmirUyeleri
AS
SELECT * FROM dbo.Kisi
WHERE Sehir='izmir'
WITH CHECK OPTION

Şimdi bu oluşturduğumuz "view" üzerinden "insert" işlemi gerçekleştirelim.
INSERT INTO IzmirUyeleri VALUES ('Gaffar','izmir')
Koşul arandı, koşula uyuyor. "insert" gerçekleşti.            
SELECT * FROM dbo.Kisi
INSERT INTO IzmirUyeleri VALUES ('Serdar','Bursa')
Koşul arandı, koşula uymuuyor. "insert" gerçekleşmedi. Aşağıda görüldüğü gibi "WITH CHECK OPTION constraint" hatası ile karşılaşıldı. 
"The attempted insert or update failed because the target view either specifies WITH CHECK OPTION or spans a view that specifies WITH CHECK OPTION and one or more rows resulting from the operation did not qualify under the CHECK OPTION constraint.
The statement has been terminated."

Böylece yaptığımız kontrol, tabloya yalnızca istediğimiz kriter ile ekleme işlemini sağladı. Peki doğrudan tabloya ekleme işlemine bir kısıtlama getirildi mi?
INSERT INTO dbo.Kisi( Ad, Sehir ) VALUES ('Volkan','izmir')            
INSERT INTO dbo.Kisi( Ad, Sehir ) VALUES ('Ali','istanbul')
SELECT * FROM dbo.Kisi
Görüldüğü üzere doğrudan tabloya yapılan "insert" işlemlerinde her hangibir kısıtlama getirilmemiştir. "WITH CHECK OPTION" ile getirilen kısıtlama sadece "view" üzerinden yapılan "insert" işlemleri için geçerlidir. 

Bir noktaya dikkat çekmek istiyorum. Yukarıda "serdar" ismiyle, tabloya "view" üzerinden yapılmaya çalışılan fakat koşula uymadığı gerekçesiyle gerçekleşemeyen "insert" işlemi girişiminde bir "transaction" çalışmıştır. Önce "insert" gerçekleşmiş, daha sonra koşula bakılmış, koşula uymadı anlaşılınca o kayıt "delete" edilmiştir. Tükettiği "id" değerinden de kolayca farkedilebilir.

"with check option", "view" nesnelerinde "encryption ve schemabinding" gibi parametrelerle de rahatlıkla kullanılabilir.
ALTER VIEW IzmirUyeleri
WITH SCHEMABINDING,ENCRYPTION
AS
SELECT * FROM dbo.Kisi
WHERE Sehir='izmir'
WITH CHECK OPTION


Umarım yardımcı olabilmişimdir. Bir başka yazıda görüşmek dileğiyle, esenlikler dilerim. Hoşçakalın...

3 yorum:

  1. Tükettiği "id" değeri aciklamasi kolayca gozden kacabilecek bir durumu cok iyi ortaya koymus. Ornek icin tesekkurler.

    YanıtlaSil
  2. Açık, net, temiz bir anlatım olmuş.

    YanıtlaSil