6 Mayıs 2012 Pazar

MS SQL 'de With Schemabinding

Merhaba arkadaşlar.
Sql Server 'da bazen oluşturduğumuz "view, function, stored procedure yada trigger" gibi veritabanı nesnelerimizde kullandığımız belirli kolonlarımızın değiştirilememesini yada silinememesini isteyebiliriz. İşte bunun için nesnelerimizi oluştururken "with schemabinding" parametresini ekleyerek kullandığımız kolonları koruma altına alabiliriz. Kolonlar ilgili tabloda hiçbir şekilde değiştirilemez ve silinemez. Örneğin kolonun adı yada tipi değiştirilemez. Ancak kolondaki verilere her türlü değişiklik yapılabilir, yani kolonlara "insert, update, delete" komutları uygulanabilir.

"Schemabinding" parametresini kullanırken dikkat edilmesi gereken iki önemli kuralı vardır:
  1. Birinci kural: Nesnemi oluştururken kullandığım kolonları  "Asterisk" (*) işareti ile belirtemem. Hangi kolonları koruma altına almak istiyorsam, kolonların adlarını yazarak belirtmeliyim.Gerekirse tüm kolonları koruma altına alacaksam hepsini "from" deyiminden önce yazmalıyım.
  2. İkinci kural: Nesnemi "schemabinding" ile oluştururken kullandığım tabloları "dbo" (database owner) anahtar sözcüğüyle kullanmam gerekiyor. "dbo" deyimine, "nesnenin ikinci kısmı" da denir. Veritabanı sahibi olduğumu belirtmeliyim. "Scalar Functions" nesneleri de ikinci kısımlarıyla çağrılması gerekiyordu.
Örneklerde "View" üzerinden gideceğim. "Schemabinding" 'in kullanımı diğer nesnelerde de aynıdır. "View" nesnemizde "Products" tablosundaki "foreign key" sütünlarını daha anlamlı görebilmek için "join" ile bir sorgu yazalım.

CREATE VIEW UrunKatTed
WITH SCHEMABINDING
AS
SELECT p.ProductName, c.CategoryName, s.CompanyName
FROM dbo.Products p
INNER JOIN dbo.Categories c
ON p.CategoryID = c.CategoryID
INNER JOIN dbo.Suppliers s
ON s.SupplierID = p.SupplierID

"View" imizi oluşturduk. Şimdi çağıralım. Çağırırken "dbo" kullanmama gerek yok. İki türlü de çağırabilirim.
SELECT * FROM UrunKatTed 
SELECT * FROM dbo.UrunKatTed 

Eğer "view" nesnemizde tanımlanan tabloları, "view" i "alter" yaparak, "dbo" 'suz kullansaydım, "view" nesnem değişmeyecek ve aşağıdaki hata ile karşılaşılacaktır.
ALTER VIEW UrunKatTed
WITH SCHEMABINDING
AS
SELECT p.ProductName, c.CategoryName, s.CompanyName
FROM Products p
INNER JOIN Categories c
ON p.CategoryID = c.CategoryID
INNER JOIN Suppliers s
ON s.SupplierID = p.SupplierID

"Cannot schema bind view 'UrunKatTed' because name 'Products' is invalid for schema binding. Names must be in two-part format and an object cannot reference itself."


"View" tanımlanırken ilk önce "Products" tablosu kullanıldığı için bu tablo için hata mesajı verdi ve altındaki kodlar çalışmadı. Yine eğer nesnemi tanımlarken spesific kolonlar belirtmeseydim, "asterisk" işareti kullansaydım, yine hata alacaktım.

ALTER VIEW UrunKatTed
WITH SCHEMABINDING
AS
SELECT --p.ProductName, c.CategoryName, s.CompanyName
FROM dbo.Products p
INNER JOIN dbo.Categories c
ON p.CategoryID = c.CategoryID
INNER JOIN dbo.Suppliers s
ON s.SupplierID = p.SupplierID

Eğer "encryption" özelliğini de kullanmak istersem, aşağıdaki gibi bir kullanım söz konusudur.

CREATE VIEW UrunKat
WITH SCHEMABINDING,ENCRYPTION
AS
    SELECT p.ProductName,c.CategoryName 
    FROM dbo.Products p
    INNER JOIN dbo.Categories c
    ON p.CategoryID = c.CategoryID
    WHERE c.CategoryName>'C'

Böyle bir kullanımla: hem kaynak kodlarının görünmemesini hem de kaynak kodlarında kullanılan kolonların değiştirilememesini ve silinememesini sağlayabiliriz. Ayrıca bu oluşturulan "view" nesnesine yapılan "insert" işlemlerinin, "view" de tanımlanan kritere uygunluğunu da kontrol edebiliriz. Bu kontrol için de "with check option" parametresini kullanmalıyız. Bu parametreyi de başka yazılarda incelemek dileğiyle, hoşçakalın..

Hiç yorum yok:

Yorum Gönder