Masters Of SQL

SQL Server ile ilgili bilgiler, hayata dair paylaşımlar ve birazda eğlence tabii...
Deadlock’sız, Blocking’siz, Contention’sız günler diliyoruz :)
Sysadmin sizinle olsun

Nedir Bu SQL Server AUDIT? (Bölüm 1)

Merhaba güzel insanlar, görüşmeyeli nasılsınız? Bugün bir Audit yazısıyla karşınızdayız. Aradığınızı bulmanızı, bulamadığınızı sormanızı temenni eder, iyi okumalar dilerim :)

Gelelim Audite :)

SQL Server dünyasına 2008’de giren Audits özelliği, security anlamında DBA’lere güzel avantajlar sağlayan bir özelliktir. Örneğin; server üzerinde kim database oluşturmuş, kim database silmiş, kim bir değişiklik yapmış, yeni oluşturulan bir login bilgisi, incelemek istediğimiz bir tabloya kim kayıt eklemiş, kim kayıt silmiş tarzında sorularımıza cevap bulabileceğimiz, veri tabanımızda belirlediğimiz çerçevede güvenliğimizi sağlayabilmemize olanak sağlayan, 2012 de filter seçeneği ile filtreleme de yapabildiğimiz ekstra yeni özelliklerle hayatımıza dahil olan, incelenmesi gereken bir özelliktir.

Ne dersiniz? Beraber yapalım mı basit bir Audit örneği :)

Security’nin altındaki Audits’e tıklarak “New Audit” diyoruz.


Karşımıza Create Audit ekranı çıkıyor.


Bu ekranda,
Audit name kutucuğunda, oluşturacağımız Audit’e isim vermemiz gerekiyor.
Queue delay kutucuğu default değeri 1000 ms olarak geliyor. Bunun anlamı, biriktirilen verilerin, kayıt yerindeki dosyamıza her bir saniyede bir yazılacağını ifade etmektedir. Bu değer’i 0 yaparsak, eş zamanlı yazılacağı anlamına gelir.
On Audit Log Failure seçeneğinde seçeneğinde Audit’imizin fail olması durumunda ne olacağını seçmemizi istiyor. “Shut Down Server” a dikkat etmenizi tavsiye ederim. Kaş yaparken göz çıkarmayalım :P
Audit Destination’da Audit’imizin nereye yazılacağını seçmemiz gerekiyor. 

Seçeneklerimiz File, Security Log ve Application Log. Ben, D’nin altında açtığım Audit klasörünün altına yazmasını istediğim için file’ı seçiyorum.


Audit File Maximum Limit kutucuğunda ulaşabileceği maximum file sayısını belirleme imkanı sunuyor bize sevgili SQL Server.
Filter seçeneği, aslında bizim yazdığımız query’lerdeki where kısmı. Buraya nasıl bir filtreleme yapmak istiyorsak, o şekilde yazabiliyoruz. Örneğin; ben içinde truncate geçen statementları loglamamasını istedim. 



İster OK’a basarak, Audit’imizi oluşturabilir, istersek Sol üst köşedeki Script’e tıklayarak, penceremizde açılan scripti çalıştırarak Audit’imizi oluşturabiliriz.

    
USE [master]
GO

CREATE SERVER AUDIT [Audit_DDL]
TO FILE 
(	FILEPATH = N'D:\Audit'
	,MAXSIZE = 0 MB
	,MAX_ROLLOVER_FILES = 2147483647
	,RESERVE_DISK_SPACE = OFF
)
WITH
(	QUEUE_DELAY = 1000
	,ON_FAILURE = CONTINUE
)

WHERE statement not like '%truncate%'
   
Auditimizi oluşturduk. Fakat defaultta oluşturduğumuz Audit disable gelir. Bu sebeple Auditimizin üzerine sağ tıklayarak enable duruma getiriyoruz.


Auditimizi oluşturmuş olsak da halen hedefimize ulaşmış sayılmayız. Şimdiki adımımızda, Server bazlı obje değişikliklerini, yeni oluşturulan loginlerin loglamasını hedeflediğimiz bir server bazlı Audit oluşturarak, bu Auditimizi kullanmasını sağlamalıyız. Bunun için, Server Audit Specifications’a sağ tıklayarak New Server Audit Specification… a tıklıyoruz.

Karşımıza çıkan pencerede, neleri loglamasını istiyorsak seçiyoruz. Ben yeni oluşturulan veya silinen bir database i loglaması için Database Change Group, server düzeyinde obje değişikliklerini yakalaması için Schema Object Change Group u ve Login create- drop larını yakalayabilmek için Server Principal Change Group u seçiyorum. Siz isterseniz, kendi ihtiyaçlarınıza göre farklı kombinasyonlar yapabilirsiniz.


Aynı şekilde, pencereden Ok a basarak veya sol üst köşeden aldığımız Script ile Server Bazlı Auditimizi oluştururuz.
USE [master]
GO

CREATE SERVER AUDIT SPECIFICATION [Server_DDL]
FOR SERVER AUDIT [Audit_DDL]
ADD (DATABASE_CHANGE_GROUP),
ADD (SCHEMA_OBJECT_CHANGE_GROUP),
ADD (SERVER_PRINCIPAL_CHANGE_GROUP)
   
Yine, enable etmek gerekiyor tabi :) Audit oluşturma işlememiz tamamlandı. Auditimizin kontrolleri bir sonraki bölümümüzde :) Bakalım Auditimiz olmuş mu? 

Auditimizi DMV ve function ile nasıl incelendiğimizi anlattığımız 2.bölüm için: Nedir Bu SQL Server AUDIT?(Bölüm 2)

Query Query Nereye Kadar? :)

Merhabalar MastersOfSql'in güzide okuyucuları :) Gelelim birazcık da eğlenerek öğrenme kısmına :P Bulmacamızı çözen arkadaşlarımızın info@mastersofsql.com adresine mail atmalarını tavsiye ederiz. Bu ilk bulmaca alıştırmalık olsun :):) sonrakiler için eksiksiz ve doğru bir şekilde bulmacayı çözerek, bize ileten arkadaşlarımız arasında yapacağımız çekilişle, talihli bir arkadaşımıza küçük bir hediye yollamayı düşünüyoruz. Küçük bulmacamızın, hoşunuza gitmesini temenni eder, keyifli vakitler dileriz.

Bulmacamızın, Word halini indirmek için buyrun tık tık : SQL_puzzle.doc (256,4KB)

   
1
                        2      
                             
                3 4
                    5        
                           
                6
                           
              8                
7            
                             
              9        
        10                
                             
                             
                               
                               

Soldan sağa
3. “Aaaa bulmaca çok güzel fikirmiş, bu akşam yazarsın değil mi!” diyerek, bir anda zavallı çırağına görev veren Master DBA’miz. Bu nedir yaa! Resmen çaya, çorbaya kandırıyor zavallı çırağını. Bence şöyle olmalı, herkes tecrübe yılı ile orantılı olacak şekilde yazı yazsın. Nasıl fikir? Hayatta olmaz dediğini duyar gibiyim:D :P

4. Bilmeyene açıklaması birazcık(!) zor olan kelime :) Veri Tabanı Yöneticisi anlamına gelen bu unvanı hakkıyla öğrenmek çok zaman ve emek isteyen bir iş. Seçerken dikkatli olun, zira geceniz gündüzünüze karışabilir.

6. En basit tabiriyle verilerin tutulduğu, ilişkilendirilebildiği, güncellenebildiği, gerektiğinde silinebildiği ve daha bir sürü şeyin yapılabildiği yer. SQL camiasında AdventureWork, Northwind demoların baş tacı oldu, az kahrımızı çekmedi. Bu baş taçlarımızın genel adı ne?

7. Microsoft SQL Server 2016’da görmekten keyif alacağımız yeni özelliklerden biri daha. Execution Plan, var oldu olalı böyle kıyak görmedi. Hadi yine iyisin Execution Plan, eski anılarını kullanabileceğin bir dükkan yapmışlar sana. Dükkan da dedim, artık Fill in the blanks please...

9. Microsoft SQL Server 2016’da yeni gelen bir özellik. Açılımı JavaScript Object Notation olan bu destek, SQL Severlerini yeni maceralara sürükleyecek gibi :)

10. Açılımını söylersek, hemen bulacaksınız :)O sebeple azıcık yokuş yapalım, örnekten anlatalım. Microsoft SQL Server 2016 hemen çıkmadı ama fragman niteliğinde sürümleri çıktı. Hatta Ekim ayı sonunda 3.0 ı yayınlandı. Bu ön sürüme ne diyorduk?

Yukarıdan aşağıya
1. Kendisinden çok daha tecrübeli Master’ının engin bilgilerinden faydalanmak için ve bunu diğer SQL sever arkadaşları ile paylaşmaya çalışan, bulmaca boyunca okuduğunuz yazıları yazan kişi. Master yazarımız, her ne kadar her yazıda kendisine dokundursa da, bu bulmacada eline düşmüştür.

2. İşini iyi yapan bir DBA’in en güzel görevi :P Saydığımız 11 madde vardı ya, işte oradaki maddelerden biri. Eğer tüm işlerini iyi yaptıktan sonra DBA’miz, kendine durduk yere bir iş daha çıkarmazsa tabi :)

5. İçinde Structured Query Language’in kısaltmasını bulunduran bu kelime, aynı zamanda adını sık sık kullandığımız, kurduğumuz instance’lara dahi isim olarak verdiğimiz, sitemizin güzide ismi.

8. Microsoft SQL Server 2016 ön sürümünün kurulumunda gözümüze çarpan bir değişiklik. Kurulum aşamasında “Database Engin Configuration”da karşımıza çıkıyor bu değişiklik. Gözümüze çarpmayacak gibi de değil hani, küçücük bir kutu değil ki :) Adamlar kocaman sekme yapmışlar :P Bu sekmede adını bulmanız gereken şeyle alakalı düzenlemeler yapıyorsunuz.


Sorular için yardımcı olabilecek yazılar :) 

1,3,5 numaralı sorular için : 

2,4 numaralı sorular için : http://www.mastersofsql.com/post/2015/11/10/dba-mi-o-ne-olaki http://www.mastersofsql.com/post/2015/11/10/dba-mi-o-ne-olaki-bolum-2 

7,9,10 numaralı sorular için : 

8 numaralı soru için : 

SQL 2016 yenilikleri (CTP3)



Gün geçmiyor ki Microsoft yeni bir sürümle karşımıza çıkmasın :). Daha önce Padawan'ın güzel güzel anlattığı SQL Server 2016 CTP3 kurulum makalesinden sonra yoğun baskılar sonucunda bana da yenilikleri makalesini yazmak kaldı; arkadaş eskiden bir usta çırak ilişkisi vardı :) çıraklar ustalarına böyle zorla birşeyler yaptıramazlardı ah ah nerede o eski günler :):) işin şaka ve goy goy kısmını geçtikten sonra asıl mevzuya girelim tabii detaylara fazla girmeden sadece literatürünüz gelişsin diye yazdım. :)

• SQL Server 2016 (CTP 3.0) indirmek için tıklayınız Community Technology Preview 3 (CTP 3.0), go to Evaluation Center.
• Azure hesabınız varsa SQL Server 2016 kurulu hazır Virtual Machine için tıklayınız

SQL Server 2016 Faydaları:
• Geliştirilmiş bellek performansı sayesinde 30x daha hızlı işlemler, disk tabanlı ilişkisel veritabanları ve gerçek zamanlı operasyonel analitik işlemlerde 100x daha hızlı sorgular.
• Kurum içi ve bulut içinde kullanılan sistemlerde uygulamalarda değişiklik yapmadan verilerinizi Encrypted olarak korumanıza yardımcı olur.
• Stretch Veritabanı teknolojisi sayesinde uygulamada değişiklik olmadan güvenli bir şekilde, OLTP verileriniz için Microsoft Azure da tarihsel olarak tutmanızı sağlar.
• Windows, iOS ve Android için yerel uygulamalar ile mobil cihazlarda zengin görsellik.
• PolyBase T-SQL kullanarak ilişkisel ve ilişkisel olmayan sorgularınızın yönetimini kolaylaştırın.
• AlwaysOn tarafında Azure SQL Server secondaries node kullanarak daha hızlı hibrid yedekleme, yüksek kullanılabilirlik ve felaket kurtarma senaryoları (HADR)

Genelde yenilikler SSMS üzerinde olduğundan dolayı O Services i anlattım. Ayrıca özellikle Analytics le ilgilenen arkadaşlar için yeni services olan SQL Server R Services duyuruldu bu kısımlar biraz daha olgunlaştıkça makale halinde yayınlamaya çalışacağız.

Database Engine (SSMS)
   
Stretch Database
Server terminolojisine yeni katılmış bir özellik. Yaptığı iş aslında çok güzel (gerçi şu azure a bir alışamadım :) ) lokalde bulunan veritabanının tarihsel olarak değişimlerini azure da bulunan sql sunucuya gönderiyor. Bu sayede hem lokal db de çalışırken hem de uzak verilere kesintisiz olarak erişmemizi sağlıyor.




JSON Desteği
Evet artık geldi beklenen gün bugünmüş. Yazılım tarafına ve rakip dblere JSON geleli yıllar oldu :):) peki kullanımı nasıl?

         SELECT * FROM OPENJSON ('{"version":"SQL Server 2016 (CTP3)","build":13,"date":"28.10.2015"}')
         


            SELECT [key], value
            FROM OPENJSON('["en-GB", "en-UK","tr-TR"]')
         


Columnstore Index
SQL Server hayatına 2012 ile birlikte giren ColumnStore Index her geçen gün güçlenerek büyümeye devam ediyor. Önce OLAP mimarisine geldi sonrasında OLTP ye eklediler şimdi ise InMemory table lara ekleme yapıldı. Microsoft un sayfasında açıkladığı gibi gelen yapılar (gelecek diyelim :) ) aşağıda.  


Columnstore Index Feature

SQL Server 2012

SQL Server 2014

SQL Server 2016 Community Technology Preview 3 (CTP 3.0)

Batch execution for multi-threaded queries

yes

yes

yes

Batch execution for single-threaded queries

yes

Archival compression option.

yes

yes

Snapshot isolation and read-committed snapshot isolation

yes

Specify columnstore index when creating a table.

yes

AlwaysOn supports columnstore indexes.

yes

yes

yes

AlwaysOn readable secondary supports read-only nonclustered columnstore index

yes

yes

yes

AlwaysOn readable secondary supports updateable columnstore indexes.

yes

Read-only nonclustered columnstore index on heap or btree.

yes

yes

yes1

Updateable nonclustered columnstore index on heap or btree

yes

Additional btree indexes allowed on a heap or btree that has a nonclustered columnstore index.

yes

yes

yes

Updateable clustered columnstore index.

yes

yes

Btree index on a clustered columnstore index.

yes

Columnstore index on a memory-optimized table.

yes

Nonclustered columnstore index definition supports using a filtered condition.

yes

1 To create a readable nonclustered columnstore index, store the index on a read-only filegroup.

     

Query Store
InMemory tablolarda desteklenmeye başlandı (CTP3). SQL Server 2016 ile hayatımıza giren bir kavram ve yaptığı iş DBA ler için ileride çok işe yarayacak gibi duruyor. Peki ne olaki bu Query Store :). Sorgular esnasında oluşan Execution Planlarları saklayarak geriye doğru inceleme yapmamızı ve istediğimiz birini kullanmamızı sağlayacak.

Kısaca aşağıdaki ayarla açıp kapatacağız.
    ALTER DATABASE AdventureWorks2012 SET QUERY_STORE = ON;
    




Temporal Tables (System-Versioned Tables)
Yazılım ekipleri ve DBA ler yıllardır tablolarda yapılan değişiklikleri görebilmek için taklalar atmak zorunda kalmışlardı ya trigger kullanarak insert, update ve delete ler başka bir tabloya alınmış ya da yazılım katmanında history tablolar yapılarak çözüm üretmişlerdi. SQL Server 2016 ile artık tabloların tarihsel olarak geçmişine otomatik olarak ulaşabileceğiz.

    		CREATE SCHEMA History
GO
CREATE TABLE dbo.Personel 
(
    PersonelNo int NOT NULL PRIMARY KEY CLUSTERED, 
    Ad nvarchar(50) NOT NULL, 
    Soyad nvarchar(50) NOT NULL,
    SysStartTime datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL, 
    SysEndTime datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,   
    PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime)   
)
WITH 
    (
		SYSTEM_VERSIONING = ON ( HISTORY_TABLE = History.Personel ) 
    );

    


Yeni bir özellik olduğundan dolayı bazı kısıtlamaları var tabii. Bunları uzun uzun yazmayalım linkten öğrenebilirsiniz. https://msdn.microsoft.com/en-US/library/mt604468.aspx


Always Encrypted
Verileriniz artık daha güvenli “Bizede mi lolo” Şifreleme için kullanılan KEY’i olmayan veriye ulaşamayacak (ama KEY’i yedeklemeyi unutmayın).


Dynamic Data Masking
Yine 3th parti uygulamalara taş koyacak Özellikle Day1 (devan diyenlerde var) ve UAT sistemlerde gizlenmesi gereken veriler için kullanacağımız güzel bir özellik. Daha detaylı olarak bir makalede inceleyeceğiz bununla birlikte default value ları aşağıdaki gibidir.




Birazda neler yapabileceğimizi hayal edelim :)

    
    select * from Personel 
    




Sonrasında Soyad kolonuna MASKED uyguluyoruz.
ALTER TABLE Personel
ALTER COLUMN Soyad ADD MASKED WITH (FUNCTION = 'partial(2,"XXX",0)');


ve bir tane TestUser oluşturarak onunla tablomuza Select çekiyoruz.

CREATE USER TestUser WITHOUT LOGIN;
GRANT SELECT ON Personel TO TestUser;

EXECUTE AS USER = 'TestUser';
SELECT * FROM Personel;
REVERT;



Veri tabanı içerisinde MASKED uygulanmış kolonları bulmak için aşağıdaki query çalıştırılır.

SELECT c.name, tbl.name as table_name, c.is_masked, c.masking_function
FROM sys.masked_columns AS c
JOIN sys.tables AS tbl 
    ON c.[object_id] = tbl.[object_id]
WHERE is_masked = 1;

        



Replication Geliştirmeleri

Memory-Optimized tablolarda artık replication destekleniyor. Azure database i içinde replication desteği başladı.