SQL Server’da sadece Okunabilir tablo Nasıl oluşturulur ?

read-only-table

Veritabanı Yöneticilerinin / Geliştiricilerinin yeni yıl sonlarında yada başlarında yaşadıkları sorunlardan biri de sadece okunabilir bir tablo’ya ihtiyaç duyulmasıdır. Peki firmalar neden sadece okuma amaçlı bir tablo kullanma ihtiyacı hissedebilir hemen bir örnek vereyim. Mali takvim yıl ayrıntıları, satış verileri hedefleri vs gibi değerler sene sona ererken yada başlarken verilebilir. Bu veriler çeşitli bölümlere ait olacaktır ve dönem için ayarlandıktan sonra yetkili bölümler tarafından yapılmadıkça veri modifikasyonlarını engellenmesi gerekirebilir böyle bir durumda bu yapıya ihtiyaç duyabilirsiniz.

Yukarıda bahsettiğimiz ihtiyaç için bir kaç farklı çözüm yöntemi uygulayabilirsiniz, bunları sırası ile aşağıda anlatıyor olacağım.

Yöntem 1 : Read-Only FileGroup oluşturulması

Yöntemin işlem basamakları aşağıdaki gibidir.

1) Yeni bir FileGroup oluşturun.

2) Tabloyu oluşturduğunuz FileGroup üzerinde oluşturun.

3) Tablonuzun gerekli veriler ile doldurun.

4) Oluşturduğunuz filegroup’u read-only olarak alter edin.

Örnek kod blokları ise aşağıdaki gibidir. (Kodlar MSHOWTO Veritabanı için uygulanmıştır. )

ALTER DATABASE [MSHOWTO]
ADD FILEGROUP FG_FinansRead2019;
GO
ALTER DATABASE [MSHOWTO]
ADD FILE
(
NAME = ROFG,
FILENAME = ‘D:\DATA\FinansRead2019\FinansRead2019.ndf’,
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP FG_FinansRead2019;
GO

Filegroup üzerinde tabloyu oluşturuyoruz.

CREATE TABLE FinansalHedefler2019
(
ID int IDENTITY(1,1),
YearVal int,
QuarterVal int,
TargetVal int
)
ON FG_FinansRead2019

Örnek Kayıtları ekliyoruz.

INSERT into FinansalHedefler2019 VALUES
(2019,1,1800),
(2019,2,3500),
(2019,3,1200),
(2019,4,2540),
(2019,5,690),
(2019,6,2420),
(2019,7,4333),
(2019,8,3123)

Filegroup’u read-only olarak ayarlıyoruz.

ALTER DATABASE [MSHOWTO] MODIFY FILEGROUP FG_FinansRead2019 READ_ONLY

İşlem sonrasında tablomuza kayıt eklemeye çalışıyoruz.

INSERT into FinansalHedefler2019

VALUES (2019,9,5541)

Hata mesajımız ;

Resim-1

Artıları

  1. Yönetimi daha kolay
  2. Filegroup değişiklikleri yaparak, yeni tablolara daha rahat uygulanabilir.
  3. Kullanıcı erişimlerinde / yetkilerinde değişiklik yapmaya gerek yok.

Eksileri

  1. Bahsedilen işlemleri uygulayabilmek için sunucuda en azından dbcreator rolüne sahip bir kullanıcı gerekli.

Yöntem 2 : DML İşlemlerini önlemek için DENY deyimi kullanımı

Bu durumda, tabloda veri değişikliğini önlemek için açık bir DENY işlemi yapabiliriz.

Yöntem2 için yeni tablo oluşturulur.

CREATE TABLE FinansalHedefler2019_Yontem2
(
ID int IDENTITY(1,1),
YearVal int,
QuarterVal int,
TargetVal int
)

Yeni oluşturulan tabloya örnek kayıtlar girilir.

INSERT into FinansalHedefler2019_Yontem2 VALUES
(2019,1,1800),
(2019,2,3500),
(2019,3,1200),
(2019,4,2540),
(2019,5,690),
(2019,6,2420),
(2019,7,4333),
(2019,8,3123)

Kısıtlı erişime sahip olacak yeni bir kullanıcı oluşturulur.

Resim-2

User Mapping bölümünde ;

Resim-3

Oluşturduğumuz kullanıcı için INSERT,UPDATE ve DELETE işlemlerini için yetkilerini kaldıralım.

DENY INSERT, UPDATE, DELETE ON FinansalHedefler2019_Yontem2 TO kisitlikullanici

Yeni kayıt eklemeye çalışalım / silmeye çalışalım / update etmeye çalışalım.

INSERT into FinansalHedefler2019_Yontem2 VALUES (2019,9,5541)

Hata Mesajımız ;

Resim-4

Bunun birden fazla kullanıcı için uygulanmasını istiyorsanız eğer yeni bir user role oluşturup kullanıcı o role içerisine ekleyip, deny işlemini o role grup üzerine uygulamanız gerekmektedir.

Artıları

  1. DML işlemlerinin izinleri, kullanıcılar için seçici olarak veya ayrı olarak uygulanabilir

Eksileri

  1. Yönetim çabası çok büyük.Her kullanıcının erişim rolünün ayarlanması / ayrı olarak oluşturulan role eklenmesi gerekir
  2. Yönetici düzeyinde kullanıcılar veya yükseltilmiş izinlere sahip kullanıcılar bu yöntemi kullanarak erişimi kısıtlayamaz. Sysadmin, dbcreator rolü gibi.

Yöntem 3 : Tabloya Instead Of Trigger tanımlaması yapılması

Kullanıcılar tarafından veri manipülasyonunu kısıtlamak için tabloya İnstead Of Trigger tanımlaması yapılabilir. Örneği aşağıdaki gibidir.

Yöntem3 için yeni tablo oluşturulur.

CREATE TABLE FinansalHedefler2019_Yontem3
(
ID int IDENTITY(1,1),
YearVal int,
QuarterVal int,
TargetVal int
)

Örnek kayıtlar eklenir.

INSERT FinansalHedefler2019_Yontem3 VALUES
(2019,1,1800),
(2019,2,3500),
(2019,3,1200),
(2019,4,2540),
(2019,5,690),
(2019,6,2420),
(2019,7,4333),
(2019,8,312)

Instead Of trigger tanımlaması yapılır.

CREATE TRIGGER trg_FinansalHedefler2019_Yontem3
ON FinansalHedefler2019_Yontem3
INSTEAD OF INSERT,UPDATE,DELETE
AS
BEGIN
RAISERROR (‘Bu tablo sadece okunabilir, herhangi bir Insert,Update,Delete işlemi uygulanamaz!’,16,1)
Rollback;
END

Yeni Kayıtlar eklenir.

INSERT into FinansalHedefler2019_Yontem3 VALUES (2019,9,5541)

Hata mesajımız :

Resim-5

Artıları

  1. Her kullanıcı veya rol için ayrıcalıklara gerek yok

Eksileri

  1. Bir tetikleyici / trigger kullanmanın ek yükü

İhtiyaç duyulan sadece okunabilir tabloyu (Read-Only tablo – Table ) oluşturmayı bu yazımızda incelemiş olduk.

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar

www.mshowto.org 

TAGs: sadece okunabilir tablo olusturma, sql, SQL Server, sql server read only table create

Yazı gezinmesi

Mobil sürümden çık