6 Mayıs 2012 Pazar

MS SQL'de With Encryption

Merhaba arkadaşlar.
Bazen oluşturduğumuz nesnelerimizin güvenlik sebebiyle kilitlemek isteyebiliriz. Bu nesnelerim "view, function, triggger" yada bir "stored procedure" olabilir. Bunun için nesnelerimi tanımlarken, "as" deyiminden önce "with encryption" anahtar kelimesiyle, nesnemin gövdesinin artık kullanan kişilere karşı görünmemesini sağlayabilirim. "Encryption", kelime anlamı olarak şifreleme işlemidir. Hemen bir örnek ile, ilk önce bir "view" nesnesi üzerinde görelim. "UrunKatTed" adında "Products" tablosundaki "foreign key" kolonlarını daha anlamlı görebilmek için bir "view" yazalım ve bunu "with encryption" parametresiyle kilitleyelim.
NOT: Örneklerde "View" üzerinden gideceğim. "Encryption" 'in kullanımı diğer nesnelerde de aynıdır.


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

"View" nesnem oluştu. "Object Explorer" penceresinde "view" 'lerin bulunduğu sekmeye gidip bir bakıyorum.
"View" oluştu fakat ikonunda bir "kilit" simgesi meydana geldi. Sistemde kayıtlı olan her hangibir "view" ' sağtık yaptığımda "design" seçeneğinin aktif olduğu açıkça görülüyor.
Bir de "with encryption" ile oluşturduğumuz "view" nesnemize bakalım.
Görüldüğü üzere "design" seçeneği inaktif. 
NOT"With encryption" ile oluşturulan bir nesnenin "design" seçeneğine erişilemez. Erişilebilseydi "encryp" etmenin bir anlamı olmazdı. Bir de script 'ini almaya çalışırsam, aşağıdaki gibi "encrypted" bilgisi mesajıyla, erişilemez hatası verir.
Bu nedenle "encrypted" ettiğim bir nesnenin gövdesinin kaynak kodlarını saklamakta fayda var. Çünkü sonradan nesnemin ne iş yaptığına bakmak isteyebilirim. Bunun dışında "encrypted" ettiğim nesnemi "alter" ile istediğim şekilde değiştirebilir. Yine "drop" ile de silebilirim. Yukarıda tanımladığımız "view" nesnemizin gövdesi aynı kalacak şekilde oluşturduğumuz kilidi kaldırmak istersek, "with encryption" parametresini kaldırarak "alter" etmek yeterli olacaktır.

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

Böylece "view" nesnesi yine aynı işi yapacaktır. İsteseydik "with encryption" parametresini kaldırırken gövdesini de değiştirebilirdik. Eğer "schemabinding" özelliğini de kullanmak istenirse, aşağıdaki gibi bir "view" tanımlanarak "encryption" ile kullanılabilir.

ALTER VIEW UrunKatTed
WITH ENCRYPTION,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

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. "With schemabinding" parametresini ayrıca başka bir yazıda incelemek dileğiyle, hoşçakalın..

5 yorum:

  1. Çok faydalı bir makale Encription kavramı başarılı bir şekilde anlatılmış teşekkürler hocam

    YanıtlaSil
  2. kiliti açamadım yardımcı olabilirmisiniz

    YanıtlaSil
  3. delete ile sorgunuzu silin . sonra tekrar yaratın sorgunuzu ama bu sefer sorgunuzda WITH ENCRYPTION kullanmayın.

    YanıtlaSil
  4. Profiler'da gözükmezmi hocam

    YanıtlaSil
    Yanıtlar
    1. c# program geliştirdim sql sorgusu çalıştırdığımda profiller çıkmamasını çözebildiniz mi ?

      Sil