Aylar: Mayıs 2018

Tabloda Kolon gizlemek

Tabloda Kolon gizlemek

SQL 2017 ile gelen bu özellik  ile tablolarımızın kolonlarını  gizleyebileceğiz.

Bazı durumlarda tablo da bazı kolonların gözükmesini istemeyiz bunun için  kolon bazlı yetki verirdik bu işlem sırasında istenilen kolonlarda aşağıda ki gibi grant ile yetki verebilir ya da deny komutu ile yetkisini alabilirdik.

GRANT SELECT ON [dbo].[Employee] ([EmployeeId]) TO [Doctor];

Mevcut yetkilerini almak için aşağıda ki script kullanılabilir.

DENY SELECT ON [dbo].[Employee] ([EmployeeId]) TO [Doctor];

Fakat bu işlemler yapıldıktan sonra SELECT*FROM Employe şeklinde sorgulama yapmak istersek permission hatası verecektir.Fakat yapacağımız yöntemde ise gizlediğimiz kolon  hiç eklenmemiş gibi sonuç dönecektir.

Yapacağımız yöntemde SELECT*FROM Employe dediğimizde  o tablo da gizlediğimiz kolon gözükmeyecektir ve herhangi hata dönmeyecektir. Şimdi uygulama kısmına geçelim.

CREATE TABLE TEMP0RAL_TABLE
(
id int not null primary key clustered,
Name nvarchar(30),
address nvarchar(200),
startdate datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL  ,
enddate datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL ,
period for system_time(startdate,enddate)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.TEMP0RAL_TABLE_history));

Tabloyu oluştururken gizlemek istediğimiz kolonları seçerek gizledik ve bundan sonra sorgularda özellikle yazılmadığı sürece Mssql o tabloyu  yokmuş gibi davranacaktır.

Gizleme özelliğini tabloyu oluşturduktan sonra oluşturmak isterseniz aşağıda ki sorgu yardımıyla oluşturabilirsiniz.

ALTER TABLE [dbo].TEMP0RAL_TABLE  ALTER COLUMN [personcredit] ADD HIDDEN;

Yukarı da oluşturulurken nasıl yapılacağından bahsettik fakat bu özellik için gereken koşulları veya limitleri bahsetmedik biraz da onlar da bahsedelim.

* Gizli olarak değiştirilen kolon, alan tahsisinin iki kat yer kaplar; Orijinal kolon  ve yeni oluşturulan gizli kolondan dolayı.

* Tablo da kolonu gizlemek için GENERATED ALWAYS  komutunun da olması gerekmektedir.

* Gizlenen kolonlar direk  silinemez.

* Tabloda yapılan işlemlerde gizlenen kolon özellikle belirtilmediği sürece   işlem dışında kalır.

* Gizlenen kolon SSMS üzerinden  Column sekmesinin altından görülebilir.

Temporal table  hakkında detaylı bilgi almak için  MSSQL Temporal Table adlı  makaleyi okuyabilirsiniz.

MSSQL Temporal Table

MSSQL Temporal Table

Temporal Table, veritabanında yanlışlıkla yapılan update,delete işlemlerini kolaylıkla geri yüklememiz için çıkarılmıştır.  Bir bakıma tablo  bazlı restore işlemi yapmamıza imkan sağlayacak bu özellik SQL Server 2016 ile geldi .

Temporal table şema yapısının aynısını başka bir tabloda tutar buna History Table denir.
Çoğumuzun başına gelmiştir .Update yapılırken where koşulunu atladığımızda  istenmedik sonuçlar doğurabiliyor .Bu durumlarda  veritabanının bütün tablolarını dönüyor ve gerekli tabloyu aktarabiliyorduk fakat bu özellik sayesinde veritabanının hepsini dönmek yerine temporal table özelliğini aktif ederek sadece update yapılan rowları geri getirebiliriz.

 

Temporal table avantajlarından bahsettim şimdi  de birkaç limit ve kısıtlamalarına değineceğim;

 

*Ana tabloda primary key tanımlamalısınız.
*Partition yapısını kullanıyorsanız history table default file group da oluşturulur.

*History table primary key,foreign key ,table veya column constraint içermez.
*İndexed view desteği bulunmamaktadır.
*Truncate table komutu kullanılmamaktadır.(SYSTEM_VERSIONING=OFF  komutunu kullanarak  truncate yapılabilir.)
*ALTER TABLE ,ALTER COLUMN işlemlerinde (ONLİNE=ON) işleminin etkisi yoktur. ALTER komutlarında online işlemleri yokmuş gibi işlem yapılır.
*Eklenen Tarih kolonlarına İnsert ve Update işlemi yapılamaz.

* Merge replication desteği yoktur.
*Page bazlı sıkıştırılma yapar.
*Temporal Table   tanımlarken başlangıç ve bitiş kolonları eklememiz gerekiyor ve bu kolonların veri tipi datetime2 olması gerekiyor.

Yukarıda birkaç limit ve faydalarından bahsettim şimdi nasıl yapılacağına geçelim.

CREATE TABLE TEMP0RAL_TABLE

(

id int not null primary key clustered,

Name nvarchar(30),

addresss nvarchar(200),

startdate datetime2 generated always as row start ,

enddate datetime2 generated always as row end,

period for system_time(startdate,enddate)

)

  WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.TEMP0RAL_TABLE_history));

Yukarıda ki scripti çalıştırdığımız da aşağıda ki gibi tablomuzun oluştuğunu göreceğiz.

Theme: Overlay by Kaira Extra Text
Cape Town, South Africa