SQL SERVER 2016 RLS ( Row-Level Security )

Reading Time: 3 minutes

Güvenlik veritabanı için en önemli adımlardan bir tanesidir. Şirketler kendi verilerinin erişilmesinde içerideki Development vb. Görevlere sahip arkadaşların bile belirli yetki protokelleri üzerinden olmasını ister. SQL Server da DB bazlı, Tablo bazlı , obje ve hatta kolon bazlı bile yetkilendirmeler gerçekleştirmektedir.

Fakat bazen satır (Row) bazlı yetkilendirmelere de ihtiyaç duyulmaktadır. İşte tam bu noktasa SQL Server , 2016 sürümü ile duyurduğu yeniliği olan Row-Level Security (RLS) özelliği ile artık kullanıcılar sadece kendisini ilgilendiren kayıtları görebilecekler.

Örneğin , firmamızın sipariş ağı var ve tedarikçilerimizden elemanlarımız siparişler sisteme girmekte . Bu sipariş verilerimizi sipariş tablomuzda tutmaktayız. Fakat herkesin kendi siparişini görmesini istiyoruz. Yani elemanlar girdikleri siparişlerin takibini yapabilsinler sadece.

Şimdi bu örneğimizi uygulamalı olarak gerçekleştirelim ;

  • Test Veritabanımızı oluşturuyoruz.

  • Daha sonra sisteme veri girecek elemanlarımızı tanımlıyoruz. Yani DB üzerinde user oluşturuyoruz.

  • Bu işlemlerin ardından Sipariş tablomuzu oluşturup , içerisine de sipariş datalarını yükleyelim.

  • Çalışanlarımıza tablo üzerinde sipariş takiplerini yapmaları için SELECT yetkisi verdik.

  • Daha sonra elemanlarımızın sipariş takibi yapması için bağlantıyı gerçekleştiriyor ve tabloya SELECT yapıyoruz.

Yukarıda ki işelmden sonra yusufkahveci adlı elemanız aşağıda ki sonuçları görmektedir.

RowLevelSecurity_1

Fakat görüldüğü üzere yusufkahveci adlı çalışanımız diğer çalışanlarında sipariş süreçlerini görmektedir. İşte tam bu durumda SQL Server 2016 ile hayatımıza gire RLS yani Row-Level Security özelliği devreye girmektedir.

Bu özelliği kullanabilmek için ilk adım olarak kullanıcı sorgu çalıştırdığında True değeri dönen InLine Table Value Function oluşturalım.

Bu işlemden sonra oluşturduğumuz fonksiyonumuzu oluşturacak olduğumuz POLICY için Filter Predicate olarak ekleyelim.

Function ve Policy blok unu inceleyecek olur isek ; gördüğünüz üzere fonksiyonumuz parametre olarak kullanıcı adı alıyor ve geriye True ve NULL değer leri döndürüyor. POLICY bölümümüzde ise PRADICATE bölümünde oluşturduğumuz fn_RLS adında ki Function ‘ımız tablomuz üzerinde sorgu çalıştırıldığında otomatik olarak Filtrelemek için kullanılacağını ve hangi tablo üzerinde işlemi gerçekleştireceğini belirtmiş oluyoruz.

Aynı şekilde tekrar yusufkahveci kullanıcımız ile sipariş tablomuzu sorgulayalım.

Gördüğünüz üzere sadece yusufkahveci ‘ye ait kayıtlar gelmektedir.

RowLevelSecurity_2_SQLTRR

Örneğimizde RLS’i uygulamalı olarak sizlere aktarmış olduk. Bu özellik ile biz sorgularımıza bir parametre eklemesek de arka planda kullanıcı adını parametre olarak eklemektedir. Bu bölümde dikkat edilmesi gereken nokta ise SQL bu parametreyi eklerken performans sorunu oluşturabilir. Aşağıda Execution Plans for RLS bölümümüzde detaylı değineceğiz.

Execution Plans For RLS makalemiz yakında.

 

Leave a Reply

Your email address will not be published. Required fields are marked *