Recent comments

None


İçerik Ara











Yasal Uyarı
Bu sitede sunulan tüm bilgi ve dökümanlar Turgay Sahtiyan tarafından yazılmaktadır. Yazıların kaynak göstermek şartıyla kullanılması serbesttir.

© Copyright 2009-2013
Takvim
<<  Ekim 2017  >>
PaSaÇaPeCuCuPa
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345
Keywords

Bugün gördüğüm bir soru üzerine bu makaleyi yazmaya karar verdim. Soru şuydu; Bir DB de bulunan bütün table ların boyutlarını tek bir sql sorgusu sonucu alabilir miyiz?

Cevabımız “Tabiki” olmakla beraber bu ihtiyacı 2 farklı yöntem ile yapacağım. [more]


Cursor Kullanarak


Aşağıdaki sorgu ile istediğiniz veritabanındaki bütün user table ların boyutlarını sorgulayabilirsiniz.

--Hangi DB nin table larına bakmak istiyorsak
use AdventureWorks
GO

Create table ##TempTbl (TableName sysname, rows int, reserved varchar(20)
	, data varchar(20), index_size varchar(20), unused varchar(20))
Create table ##TempTbl2 (TableName sysname, rows int, reserved float
	, data float, index_size float, unused float)
Declare @SchemaName sysname,@Name sysname,@TableName sysName

declare CursorX cursor for 
select schema_name(schema_id),name from sys.tables where type='u'
open Cursorx
fetch from Cursorx into @SchemaName,@Name
while @@FETCH_STATUS=0
begin
    set @TableName = @SchemaName+'.'+@Name
	insert ##TempTbl
	  exec sp_spaceused @TableName
	  	
	fetch next from Cursorx into @SchemaName,@Name	
end
close Cursorx
deallocate Cursorx

insert ##TempTbl2
  select TableName,rows
    ,REPLACE(reserved,'KB','') ,REPLACE(data,'KB','')
    ,REPLACE(index_size,'KB','') ,REPLACE(unused,'KB','')
  from ##TempTbl

select * from ##TempTbl2 order by reserved desc

drop table ##TempTbl
drop table ##TempTbl2

 

Sorgu sonucu aşağıdaki gibi olacaktr.

at1

 

sp_MSforeachtable Kullanarak


Daha önceki makalerimden birinde sp_MSforeachdb ve sp_MSforeachtable SP lerinden bahsetmiştim. Bu yazıma aşağıdaki linkten ulaşabilirsiniz.

http://www.turgaysahtiyan.com/post/SQL-Server-sp_MSforeachdb-ve-sp_MSforeachtable-Undocumented-Stored-Procedure-leri.aspx

sp_MSforeachtable ile bu sorguyu çok daha kısa bir şekilde yazabiliriz.

--Hangi DB nin table larına bakmak istiyorsak
use AdventureWorks
GO

Create table ##TempTbl (TableName sysname, rows int, reserved varchar(20)
	, data varchar(20), index_size varchar(20), unused varchar(20))
Create table ##TempTbl2 (TableName sysname, rows int, reserved float
	, data float, index_size float, unused float)

exec sp_MSforeachtable 
  'insert into ##TempTbl 
     exec sp_spaceused ''?'' '

insert ##TempTbl2
  select TableName,rows
    ,REPLACE(reserved,'KB','') ,REPLACE(data,'KB','')
    ,REPLACE(index_size,'KB','') ,REPLACE(unused,'KB','')
  from ##TempTbl

select * from ##TempTbl2 order by reserved desc

drop table ##TempTbl
drop table ##TempTbl2

 

Gördüğünüz gibi bu sorgu çok daha efektif.

Sorgu sonucuna bakacak olursak;

at1

 

2 raporda da değerlerin KB cinsinden olduğu bilgisini not düşürek yazımızı sonlandıralım.

 

İyi çalışmalar,

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Hepimiz en az bir kez instance ımızda olan biteni trace edebilmek için SQL Server Profiler kullanmışızdır. Peki size, topladığımız bu profiler verilerini bir veritabanında saklayabileceğimizi ve istediğimiz an sorgulayabileceğimizi söylesem.?

SQL Server 2008 den önce bunu yapabilmek için özel application lar kullanmak gerekiyordu. Makina restart larında bu application ları tekrar çalıştırmak bazen sıkıntı olabiliyordu. Ama SQL Server 2008 ile beraber gelen Data Collection yapısı sayesinde çok büyük bir efor harcamadan SQL Server Profiler sonuçlarını istediğimiz bir veritabanında toplamamız mümkün.

Bugünkü yazıma geçmeden önce daha önce Data Collection ile alakalı makalemi okumanızı tavsiye ederim. Çünkü bugünkü yazımı o yapının üzerine kurgulayacağım. Yazıya aşağıdaki linkten ulaşabilirsiniz.
http://www.turgaysahtiyan.com/post/SQL-Server-2008-e28093-Performance-Data-Collection.aspx


Evet şimdi bugünkü yazımızın konusuna dönelim. Ne dedik? Server larımızdan trace verileri toplayacağız ve bunu bir veritabanına yazacağız. Bunun içinde Data Collection Trace Collection Set kullanacağız.


Trace Collection Set in Hazırlanması


Trace Collection Set , Trace dataları toplayıp belirttiğimiz DB ye export edip yazacak olan set tir. Bu seti SQL Server Profiler üzerinden oluşturacağız.

Ben örneğimde 1 sn den fazla süren RPC:Completed ve SQL:BatchCompleted ları toplayacağım.

Şimdi bu seti nasıl oluşturacağımıza adım adım bakalım.

  1. SQL Server Profiler ı çalıştırın. 
    sst1
  2. Toplamak istediğiniz verileri seçin. Ben 1 sn den fazla süren RPC:Completed ve SQL:BatchCompleted ları toplayacağım. Siz toplamak istediğiniz ek bilgileri ekleyebilirsiniz. 
    sst2
  3. 1 sn den fazla sürenler dediğimiz için Filter vermemiz lazım. Bunun için Column Filters ı tıklayıp Duration kriteri 1000ms olarak ayarlıyoruz. Ve Ok e basıp Filter ekranını kapatıyoruz.
    sst3
  4. Run a basarak trace i başlatıyoruz.
  5. Şu an da Profiler 1 sn den fazla süren verileri toplamaya başladı. Ama bizim amacımız bunu Collection Set olarak kaydedip Data Collection da kullanmak. Bu trace i collection set olarak kaydetmek için File >> Export >> Script Trace Definition >> For SQL Trace Collection Set menüsünden trace file a bir isim vererek kaydete basıyoruz.
    sst4

    Collection Set imiz hazır. Bir sonraki adımda bu collection set i Data Collection ına set olarak create edeceğiz.

 


Trace Collection Set in Data Collection a Create Edilmesi

Bir önceki adımda Trace Collection Set i hazırlamıştır. Şimdi ise bu collection set i Data Collection a set olarak create edeceğiz.

Bunun için Trace bilgisi toplamak istediğimiz server a SSMS ile bağlanalım ve save ettiğimiz trace file ı open file menüsünden bulup açalım.

Açılan trace script i aşağıdakine benzer bir yapıda olacaktır.

/*************************************************************/
-- SQL Trace collection set generated from SQL Server Profiler
-- Date: 27/06/2010  15:16:34
/*************************************************************/

USE msdb
GO

BEGIN TRANSACTION
BEGIN TRY

-- Define collection set
-- ***
-- *** Replace 'SqlTrace Collection Set Name Here' in the following script
-- *** with the name you want to use for the collection set.
-- ***
DECLARE @collection_set_id int;
EXEC [dbo].[sp_syscollector_create_collection_set]
    @name = N'SqlTrace Collection Set Name Here',
    @schedule_name = N'CollectorSchedule_Every_15min',
    @collection_mode = 0, -- cached mode needed for Trace collections
    @logging_level = 0, -- minimum logging
    @days_until_expiration = 5,
    @description = N'Collection set generated by SQL Server Profiler',
    @collection_set_id = @collection_set_id output;
SELECT @collection_set_id;

-- Define input and output varaibles for the collection item
DECLARE @trace_definition xml;
DECLARE @collection_item_id int;

-- Define the trace parameters as an XML variable
SELECT @trace_definition = convert(xml, 
N'

</FILTERS>

');

-- Retrieve the collector type GUID for the trace collector type
DECLARE @collector_type_GUID uniqueidentifier;
SELECT @collector_type_GUID = collector_type_uid FROM [dbo].[syscollector_collector_types] WHERE name = N'Generic SQL Trace Collector Type';

-- Create the trace collection item
-- ***
-- *** Replace 'SqlTrace Collection Item Name Here' in the following script
-- *** with the name you want to use for the collection item.
-- ***
EXEC [dbo].[sp_syscollector_create_collection_item]
   @collection_set_id = @collection_set_id,
   @collector_type_uid = @collector_type_GUID,
   @name = N'SqlTrace Collection Item Name Here',
   @frequency = 900, -- specified the frequency for checking to see if trace is still running
   @parameters = @trace_definition,
   @collection_item_id = @collection_item_id output;
SELECT @collection_item_id;

COMMIT TRANSACTION;
END TRY

BEGIN CATCH
ROLLBACK TRANSACTION;
DECLARE @ErrorMessage nvarchar(4000);
DECLARE @ErrorSeverity int;
DECLARE @ErrorState int;
DECLARE @ErrorNumber int;
DECLARE @ErrorLine int;
DECLARE @ErrorProcedure nvarchar(200);
SELECT @ErrorLine = ERROR_LINE(),
       @ErrorSeverity = ERROR_SEVERITY(),
       @ErrorState = ERROR_STATE(),
       @ErrorNumber = ERROR_NUMBER(),
       @ErrorMessage = ERROR_MESSAGE(),
       @ErrorProcedure = ISNULL(ERROR_PROCEDURE(), '-');
RAISERROR (14684, @ErrorSeverity, 1 , @ErrorNumber, @ErrorSeverity, @ErrorState, @ErrorProcedure, @ErrorLine, @ErrorMessage);
END CATCH;
GO


Bu collection set te isim gibi bazı alanları değiştirmemiz mümkün ama biz bu örneğimiz için herhangi bir değişiklik yapmadan F5 yada execute basarak script i çalıştıralım.

Eğer herhangi bir hata vermediyse tanımlama işlemlerimizi bitirmiş oluyoruz. Yeni oluşturduğumuz bu collection set i Data Collection altında görmemiz mümkün.

sst5

Gördüğünüz gibi Collection Set şu anda stop durumda. Enable etmek için sağ tıklayıp çıkan menüde Start Data Collection Set yazısını tıklayalım.

sst6

 

Trace Bilgisi Toplama ve Sorgulama


Tanımlamalarız bitti. Artık Data Collection yapımız 1 sn den fazla süren sorguları toplamak üzere ayarlandı. Şimdi bir örnek yapalım ve gerçekten trace bilgisini toplayıp toplamadığına bakalım.

1 sn den fazla süren sorgular dediğimiz için aşağıdaki gibi bir sorguyu SSMS te çalıştıralım. Bu sorgu 5 sn bekledikten sonra select i çekecektir.

WAITFOR DELAY '00:00:05'
Select * from sys.Databases

 

Normal şartlarda Collection Set 15 dk da bir verileri toplayıp DB ye yazacaktır. Biz bu süreyi beklememek için Collection Set i manuel olarak çalıştıralım.

Bunun için Trace Collection set imize sağ tıklayıp Collect and Upload Now yazısını tıklayalım.

sst7

Job ın görevini bitirmesini bekledikten sonra verilerin toplandığı DataCollectionDW DB sine bağlanalım ve aşağıdaki sorguyu çalıştıralım.

select * from snapshots.trace_data


sst8

Ola. Gördüğünüz gibi bizim sorgumuzu trace lemiş ve DB ye yazmış :)

Bu şekilde istediğiniz bütün trace bilgilerini DB de toplayabilir ve daha sonra sorgulayabilirsiniz. Geriye dönük yapılan işlemleri görmenin, performans değerlendirmelerinin önemli olduğu durumlarda bu yapı bize oldukça güzel faydalar sağlayacaktır.

Bugünkü yazımız bu kadar. Anlaşılmayan noktalarda yorum bölümünü kullanabilirsiniz.

 

İyi çalışmalar,

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Yazılım geliştiricilerin en büyük sıkıntılarından biri geliştirdikleri kodların başkaları tarafından çalınma riskidir. Execute file lar ile bu çalınma riski büyük ölçüde azaltılıyorken .Net yeni mimari yapısından kaynaklanan durum gereği .Net executable file ları bildiğiniz üzere reverse engineering yapılabilmektedir. Gerçi bu durumada önlem olarak obfuscator programları var ki bu konu başlı başına bir konu ve daha önce bloğumuzda işlenmiş durumda.

Peki ya Database Devolopment ? Geliştirdiğimiz SP, Function ve trigger ları müşteriye deploy etmemiz gerektiğinde kodlarıyla beraber apaçık şekilde mi vereceğiz. Ya da kendi firmamızda yazdığımız kodların gözükmesini istemiyorsak.

İşte bu tarz bir istek için SQL Server bize WITH Encryption key word unu sunmakta. Bu parametre ile SP, View, Function ve Trigger ları şifrelemek mümkün. 

WITH Encryption ile SP,View,Function ve Trigger ları Şifrelemek


4 obje içinde şifreleme tekniği aynı olduğu için ben sadece view i anlatacağım. Diğerlerinde aynı kod yapısı kullanılabilir.

Ufak bir view i WITH Encryption parametresi ile yazalım ve neler değiştiğini görelim.

use AdventureWorks2008
GO
CREATE VIEW VEncSample WITH ENCRYPTION
AS
  Select FirstName,LastName from Person.Person

 

View e sorgu çekmeyi deneyelim.

select * from VEncSample

 

Gördüğünüz gibi sorgu sonucunun gelme kısmında herhangi bir değişiklik yok.

Şimdi view i modify etmeye çalışalım bunun için AdventureWorks2008 >> Views kısmından view i bulalım.

view1

Burada ilk dikkatinizi çekmek istediğim konu VEncSample view inin yanındaki kilit işareti. Bu işaret bu view in encrypted olduğunu belirtmekte.

View e sağ tıkladığımızda Design in disable olduğunu göreceksiniz. Bununda sebebi encrypted olması. Dolayısıyla view i modify edemiyoruz.

view2

Peki birde view in Script ini oluşturmaya çalışalım. Bu seferde aşağıdaki gibi bir hata ile karşı karşıya kalıyoruz.

Property TextHeader is not available for View '[dbo].[VEncSample]'. This property may not exist for this object, or may not be retrievable due to insufficient access rights.  The text is encrypted. (Microsoft.SqlServer.Smo)

view3


Gördüğünüz gibi view in içeriğini görüntüleyemiyoruz.

Son bir not. Şifrelediğiniz obje lerin kodlarını kaybetmemek için script lerini açık bir halde yedeklemenizde fayda var.


İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Geçenlerde coder bir arkadaşımın sorduğu soruyu başka kullanıcıların da işine yarar diye düşündüğüm için blog uma taşıyorum.

Soru şuydu. “Bir SP im var ve bu SP nin içinde belli bir noktaya gelince işlemleri 10 sn duraklatmak istiyorum. Bunu yapabilir miyiz?”

Cevabımız. Evet bunu yapabiliriz. Hatta istediğimiz bir kodun istediğimiz bir zamanda çalışmasını da sağlayabiliriz.

Bunun için kullanacağımız ifade ler WAITFOR DELAY ve WAITFOR TIME ifadeleri.

Örneklerimize geçelim. Daha net anlaşılacaktır.


Bir kodu 10 sn bekleterek çalıştırmak


use master
GO
select GETDATE(),count(*) from sys.databases
GO
WAITFOR DELAY '00:00:10' --10 saniye bekle
GO
select GETDATE(),count(*) from sys.databases
GO

 

Yukarıdaki kodu çalıştırırsanız aşağıdaki gibi bir sonuç alacaksınızdır.

wf1

Gördüğünüz gibi 2 kod arasında 10 sn lik bir bekleme oldu.

 

Bir Kodu belirli bir zamanda çalıştırmak

Bu örneğimizde örnek kodumuzu belirli bir saatte çalıştırıyor olacağız. Ben örneğimde 22:46 saatini set ettim. Siz bu saati kendinize göre düzenlersiniz.

use master
GO
SELECT GETDATE()
GO
WAITFOR TIME '22:46:00'
select GETDATE(),count(*) from sys.databases
GO

 

Yukarıdaki kodu çalıştırırsanız aşağıdaki gibi bir sonuç alacaksınızdır.

wf2

Gördüğünüz gibi script i çalıştırdığımda saat 22:45 ama count(*) sorgusu 22:46 da çaıştırıldı.

 

Son olarak konuyla alakalı BOL linkini vererek yazımızı sonlandıralım.

http://msdn.microsoft.com/en-us/library/ms187331.aspx

 

İyi çalışmalar,

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


DBA olarak bazen system üstünde işlem yapmak isteyebiliriz. Yada server da windows account umuz yoktur ama windows üzerinde bir işlem yapmamız gerekebilir. Böyle bir durumda xp_cmdshell imdadınıza yetişecektir.

xm_cmdshell ile windows üzerinde işlettiğiniz komutları SQL Server aracılığıyla yapabilirsiniz. Burada yapabilecekleriniz SQL Server service account unun yapabilecekleri ile sınırlı. Eğer local admin se değmeyin keyfimize :)

xm_cmdshell i SQL Server da kullanan login in sysAdmin olması gerekmekte. Bu şekilde bir sysAdmin user ıyla ilk denememizi yapalım.

Örneğin c:\ klasörüne dır çekelim.

xp_cmdshell 'dir c:\'

 

Execute ettiğimizde aşağıdaki gibi bir hata aldığınız değil mi?

Msg 15281, Level 16, State 1, Procedure xp_cmdshell, Line 1
SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', see "Surface Area Configuration" in SQL Server Books Online.

Bunun sebebi SQL Server kurulumunda güvenlikten dolayı default olarak xm_cmdshell in disable gelmesi. Dolayısıyla bu işlemi gerçekleştirmek istiyorsak xp_cmdshell i enable etmeliyiz.

xp_cmdshell i sp_configure ile enable edebiliriz. bunun için aşağıdaki kodu execute etmeniz yeterlidir.

 

sp_configure 'show advanced options',1
reconfigure
sp_configure 'xp_cmdshell',1
reconfigure


dir komutunu tekrar çalıştırırsak sonucu göreceğizdir.

xp_cmdshell 'dir c:\'


dr1

Yazımın başında xp_cmdshell i kullanabilmek için sysAdmin olmak gerekiyor demiştim. Bu gerekliliğin nasıl ortadan kaldırılabileceğini anlattığım makaleme aşağıdaki linkten ulaşabilirsiniz.

http://www.turgaysahtiyan.com/post/SQL-Server-Proxy-Account-Kullanarak-sysAdmin-Olmayan-User-lara-xp_cmdshell-Kullandc4b1rmak.aspx

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Hiç instance ında bulunan bütün DB ler için bir SQL Command (Query) çalıştırma ihtiyacınız oldu mu? Yada bir DB de bulunan bütün table lar için? Normal şartlarda böyle bir işlemi CURSOR kullanarak yapmanız mümkün. ama ben size daha basit 2 tane undocumented yani Books Online da olmayan SP den bahsedeceğim.

sp_MSforeachdb


Bu SP lerden ilki sp_MSforeachdb. Bu SP ile instance ınızda bulunan bütün DB ler için istediğiniz bir SQL Command ı (Query) çalıştırabilirsiniz.

Örneğin DB ler de bulunan table sayısını nasıl bulabileceğimize bakalım. Dediğim gibi CURSOR kullanarak bu işlemi yapmamız mümkün ama biz sp_MSforeachdb bu işlemi gerçekleştireceğiz.

create table #temp1 (DBName sysName, TableCount int)
exec sp_MSforeachdb 
  'use ?
   insert into #temp1
     select "?",count(*) from sys.tables '
select * from #temp1 order by TableCount desc
drop table #temp1

 

ms1

Gördüğünüz gibi CURSOR larla uğraşmaya gerek yok. İşlem bu kadar basit.

 

sp_MSforeachtable


Diğer SP ise sp_MSforeachtable. Bu SP ile bulunulan DB deki bütün table lar için bir SQL Command (Query) çalıştırılabilir.

Örneğin AdventureWorks DB sinde bulunan table ların içerdikleri satır sayılarına bakalım.

create table #temp2 (TableName sysName, RowCountX int)
exec sp_MSforeachtable 
  'insert into #temp2
     select "?",count(*) from ? '
select * from #temp2 order by RowCountX desc
drop table #temp2

 

ms2

Bu da en az sp_MSforeachdb kadar kolay değil mi? :)

 

İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server da xp_cmdshell ile windows komutları çalıştırabilmektedir. Örneğin diskte bir noktaya erişmek ve dosyaları bir yereden bir yere kopyalamak gibi windows üzerinde yapabildiğiniz her şeyi SQL Server üzerinden yetkili bir user ile yapabilirsiniz.

SQL Server üzerinde bu işlem yapılırken SQL Server Service account unun yetkileri kullanılır. Dolayısıyla bu account yetkili olduğu kadar hakkınız vardır. Ve genellikle bu account server ın üzerinde admin hakkına sahip olduğu için server ın üzerinde dilediğiniz işlemi yapabilirsiniz.

SQL Server da xp_cmdshell i kullanabilmek için sysAdmin rolüne sahip olmak gerekmektedir. Ya da proxy account kullanmak gerekmektedir.

Bugünkü makalemizin konusuda proxy account kullanarak sysAdmin olmayan user lara xp_cmdshell i kullandırabilmek için yapılması gereken ayarların ne olduğunu anlatmak olacaktır.

Adımlar halinde yapılması gereken işlemleri anlatalım.

  1. SQL Server configuration ayarlarından xp_cmdshell i kullanıma açalım. SQL Server kurulumunda bu özellik default olarak disable gelmektedir.
    sp_configure 'show advanced options',1
    reconfigure
    GO
    sp_configure 'xp_cmdshell',1
    reconfigure
      
  2. Adım olarak denemeler yapacağız bir sql login create edelim ve master a map yapalım. Kullanıcı adı xpDeneme ve şifresi x.
    USE [master]
    GO
    CREATE LOGIN [xpDeneme] WITH PASSWORD=N'x', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
    GO
    USE [master]
    GO
    CREATE USER [xpDeneme] FOR LOGIN [xpDeneme]
    GO
  3. Şu an da xpDeneme user ı ile SQL Server üzerinden xp_cmdshell 'dir' komutunu çalıştırırsanız aşağıdaki gibi bir hata alacaksınızdır.

    The EXECUTE permission was denied on the object 'xp_cmdshell', database 'mssqlsystemresource', schema 'sys'.


    Bu hatayı almaktayız, çünkü xpDeneme login i sysAdmin değil. Dolayısıyla proxy account kullanmamız gerekmekte. Bunun için aşağıdaki kodu server üzerinde yetkili bir windows yada domain user çalıştıralım.
    EXEC sp_xp_cmdshell_proxy_account 'windowsusername', 'password';
    GO
  4. xpDeneme login i için master db sinde bulunan xp_cmdshell e execute yetkisi verelim
    GRANT exec ON xp_cmdshell TO xpDeneme
    GO
  5. xpDeneme login i ile tekrar xp_cmdshell 'dir' kodunu çalıştırırsak sonucun geldiğini göreceksiniz. Dolayısıyla işlemlerimizi tamamlamış oluyoruz.

 

Burada dikkat etmeniz gereken şöyle bir şey var. Bütün ayarlamaları yapmış olmanıza rağmen aşağıdaki gibi bir hata almanız mümkün.

An error occurred during the execution of sp_xp_cmdshell_proxy_account. Possible reasons: the provided account was invalid or the '##xp_cmdshell_proxy_account##' credential

Bunun sebebide 4.adım ı server üzerinde yetkili olan bir user için yapmamış olmanız. Bu adıma da dikkat ederseniz bir sorun yaşayacağınızı düşünmüyorum. En azından bende böyle oldu :)

 

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Performance Data Collection SQL Server 2008 ile gelen bir feature dır. Express sürümü hariç bütün Edition larda bulunmaktadır.

Adından da anlaşılacağı üzere DB ler için performance dataları toplamaya ve toplanan bu dataları raporlamaya yarayan bir yapıdır.

Özel bir veritabanı data warehouse olarak kullanılmakta ve toplanan datalar bu veritabanına yazılmaktadır.

Periyodik(Default u 15 dakika) olarak bilgileri topladığı için geriye dönük olarak belirli bir zaman aralığı için rapor alınabilmektedir.

Örneğin Disk Usage Report, Query Report veya server side trace bilgileri raporlanabilmektedir.

Örneğimizi tapmaya başlayalım. Ben bu örneğimde aşağıdaki adımlar üzerinde duracağım.

  • Data Warehouse un kurulumu.
  • Windows login in create edilmesi.
  • SQL Agent Service Account ların değiştirilmesi
  • Collection Set lerin ayarlanması
  • Raporların İzlenmesi

 

Data Warehouse Kurulumu


Daha öncede bahsettiğim gibi toplanan datalar ayrı bir veritabanında tutulmaktadır. Bu veritabanı verinin toplandığı server ın üzerinde olabileceği gibi başka bir server da da bulunabilmektedir. Biz yapımızı geniş kapsamlı düşüneceğiz. Örneğin sisteminizde ki bütün server lardan veri toplayıp farklı bir serverdaki datawarehouse a yazdığımızı düşünelim.

Örneğimizde S10Ent instance ından verileri toplayıp TS2008_1 instance ında ki datawarehouse a yazacağız.

dc1

TS2008_1 instance ındaki datewarehouse kurulumuna geçelim.

Management >> Data Collection a sağ tıklayıp Configure Management Datawarehouse yazısını tıklayalım ve çıkan ekrana next diyerek bir sonraki ekrana geçelim.

Gelen ekranda Create or upgrade a management data warehouse seçeneği seçerek next e basalım.

dc2

Gelen ekranda new butonuna basarak create edeceğimiz data warehouse için bir isim girelim. Örneğin DataCollectionDW ismini kullanalım ve OK e basarak bir önceki ekrana geçelim.

dc3

Bu ekranda Next e basarak user seçimini yapacağımız ekrana geçelim.

dc4

Bu ekranda NT AUTHORITY\SYSTEM account unu seçip next e basalım. Siz diğer hesaplardan kullanacaklarınızıda seçebilirsiniz.

Finish e basarak işlemi sonlandıralım.

TS2008_1 instance de data warehouse hazırlıkları tamamlanmış oldu.

dc5

 


Windows Login Create Edilmesi


Farklı serverlardan veri toplayıp bunları tek bir data warehouse server ına yazacağımız için SQL Server Agent service account u olarak kullanmak üzere bir windows yada domain account u oluşturmanızı tavsiye ederim.

Oluşturacağınız bu account administrator haklarına sahip olursa ekstra bir ayar yapmanıza gerek kalmayacaktır. Ama administrator olmaz ise Logon Account as a Service e bu account ın her data toplanan server için eklenmesi gerekmektedir. Ayrıca her serverda açılan, collect edilen dataların tutuldukları folder larda bu account un yetkilendirilmesi gerekmektedir.

Biz bu örneğimizde administrator haklarına sahip bir windows user kullanacağız. UserDataCollect isimli bir windows user create ederek bir sonraki adıma geçiyoruz.

 

SQL Agent Service Account ların Değiştirilmesi


Bir önceki adımda dediğim gibi SQL Server Service account ların yeni tanımladığımız windows user olan UserDataCollect ile değiştireceğiz.

Bunun için SQL Server Configuration Manager daki S10Ent ve TS2008_1 instance larında ki SQL Server Agent service lerinde değişiklik yapacağız.

SQL Server Configuration Manager ı açıyoruz ve değiştirmek istediğimiz service ın üzerine sağ tık yapıp properties ekranına geçiyoruz.

dc6

Gelen ekranı resimde görüldüğü gibi düzenliyoruz yani service account olarak UserDataCollect windows account unu kullanıyoruz.

dc7

Aynı işlemi diğer service yada servis ler içinde yapıyoruz. Dediğim gibi bütün data toplanacak server ların agent larında ve data warehouse un olduğu server ın agent ında bu service account değişikliğini yapmamız gerekmekte.

Ayrıca bu windows user ı server larda sysAdmin yapmanızda gerekecektir. Bu noktaya da dikkat etmenizi öneririm.

 

Collection Setlerin Ayarlanması


Artık Data toplanacak server larda tanımlamaları yapma vakti geldi.

Bunun için data toplanacak server da(S10ENT instance ı) Management >> Data Collection a sağ tıklayıp Configure Management Data Warehouse yazısını tıklayalım.

dc8

Gelen ekrana next diyelim ve bir sonraki ekrana geçelim. Bu ekranda bu sefer Set up Data Collection yazısını seçeceğiz. Çünkü artık data toplama ayarlarını yapmaya başlıyoruz.

dc9

Next e basarak bir sonraki ekrana geçelim. Bu ekranda Data Warehouse için ayarladığımız server için bilgiler gireceğiz.ServerName ve Database name seçimini yapalım. Bu bilgiler Data Warehouse un bulunduğu server ve DB adı. Yani bizim örneğimiz için TS2008_1 instance ında DataCollectionDW database i.

Cache Directory kısmında da toplanan verilen yazılması için bir folder seçeceğiz. Bu folder data toplanan server da yani S10ENT instance ının çalıştığı serverda olacak.

C:\ de yeni bir klasor açalım. DataCollectTemp adını verelim ve Cache Directory kısmına C:\DataCollectTemp yazıp next e basalım.

Bilgileri doldurduktan sonra ekran aşağıdaki ekrana benzer olacaktır.

dc10

Not: Daha öncede söylediğim gibi; eğer SQL Server Agent Service Account u olarak bir administrator account u kullanmazsanız, bu account u bu folder ı yetkilendirmeniz gerekmektedir.

Finish e basarak işlemi sonlandıralım.

İşlem tamamlandıktan sonra Data Collection altında aşağıda ki resimde görüldüğü gibi Data Collection Set ler oluşacaktır.

dc11

Aynı zamanda Data Collection setler için oluşan jobları SQL Server Agent >> Jobs un altında görebilirsiniz.

 

Raporların İzlenmesi


Dediğimiz gibi Data Collector default olarak 15 dakikada bir server dan bilgileri toplayacak ve data warehouse a yazacaktır. Peki biz bu bilgileri nasıl raporlayacağız.

Bunun için Data toplanan server da (S10ENT) Management >> Data Collection >> Sağ Tık >> Reports >> Management Data Warehouse kısmından istediğimiz report u seçebiliriz.

dc12

Disk Usage Report

Örneğin Disk Usage Report a bakalım. Management >> Data Collection >> Sağ Tık >> Reports >> Management Data Warehouse >> Disk Usage Report u tıklayalım.

Gelen rapor da server da bulunan DB lerin disk tekapladıkları alanların detayı görülmekte.

Database bazında, data file için başlangıç boyutu, büyüme trend i, şu anki boyutu ve günlük büyüme değerlerini görebiliriz. Aynı değerleri log file ların içinde alabiliriz.

dc13

Bu raporda AdventureWorks DB sine tıklayalım. Gelen raporda AdventureWorks DB sinin data ve log file larının hangi bileşenlerden oluştuğu görülmekte.

dc14

Aynı raporda Data/Log Files Autogrow/Autoshrink Events kısmına dikkatinizi çekmek istiyorum. Bu kısım data ve log file larının auto growth olduğu zamanları ve ne kadar sürdüğünü göstermekte. Eğer çok sık auto growth oluyorsa auto growth değerini performans amaçlı büyütmekte fayda var. bu işlemin nasıl yapıldığı Database ve Database File lar makalemizde inceleyeceğiz.

Server Activity Report


Bu raporda ise Server ın aktivitelerini görüyoruz. CPU, Memory, Disk ve Network kullanım grafikleri ile beraber beklemelerin nereden kaynaklandığını tarih aralığı vererek raporlayabiliriz.

 dc15


Query Statistics History


Son olarak Query İstatistik Tarihçesi raporuna bakalım. Bu rapor vasıtasıyla da CPU, Duration, Total I/O, Physical Reads, Logical Writes bazından bize en pahalı 10 queryi görebiliriz.

dc16

ÖZET


Data Collection SQL Server 2008 ile gelen güzel özelliklerden biri. Server lardaki aktiviteleri raporlayabilir ve performans sıkıntıları çözümünda kullanabiliriz.

 

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


turgay , 13. Haziran 2010, 22:59

Yaklaşık 1 sene gibi bir sürede SQL Server kategorisinde 100. makalemezi bugün eriştik.

Bu süreç zarfında makalelerimi okuyan, mail yoluyla takdirleri ileten herkese teşekkürlerimi sunuyorum.

200. makaleye en kısa sürede ulaşmak dileklerimle :)

 

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Daha önce “DDL Trigger nedir? Nasıl Kullanılır?” konulu bir makale yazmıştır. Hatta bu makalemde DDL Trigger ile login lerin nasıl yönetileceği üzerinde durmuştuk. Okumadıysanız bu yazımı okumanızı tavsiye ederim.

http://www.turgaysahtiyan.com/post/SQL-Server-e28093-Logon-DDL-Trigger-ile-Login-leri-Yonetme.aspx 

Bugünkü yazımda ise; DDL Trigger ile DDL Event lerin nasıl loglanabileceğini işliyor olacağız.

Bu yapı ile büyük ölçekli firmalarda sizin dışınızda gelişen DDL Eventleri loglayıp bakabileceksiniz.

Örneğin Developer larınız hangi SP leri değiştirmiş, değiştirmeden önceki hali neymiş, yeni hangi loginler create edilmiş gibi DDL Event adı altında sayılan bütün işlemleri loglayacağız.

Bunun için AdventureWorks DB sinde verilen örneği kullanacağım.

İlk önce bir örnek bir DB create edip daha sonrada logları yazacağımız bir table create edelim.

CREATE DATABASE dbDDLEventLog
GO

USE [dbDDLEventLog]
GO
CREATE TABLE [dbo].[DatabaseLog](
	[DatabaseLogID] [int] IDENTITY(1,1) NOT NULL,
	[PostTime] [datetime] NOT NULL,
	[DatabaseUser] [sysname] NOT NULL,
	[Event] [sysname] NOT NULL,
	[Schema] [sysname] NULL,
	[Object] [sysname] NULL,
	[TSQL] [nvarchar](max) NOT NULL,
	[XmlEvent] [xml] NOT NULL,
 CONSTRAINT [PK_DatabaseLog_DatabaseLogID] PRIMARY KEY NONCLUSTERED 
(
	[DatabaseLogID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

 

Şimdi loglamayı yapacak DDL Trigger ı create edelim. Açıklamalar kod un içerisindedir.

USE [dbDDLEventLog]
GO

CREATE TRIGGER [ddlDatabaseTriggerLog] ON DATABASE 
FOR DDL_DATABASE_LEVEL_EVENTS AS 
BEGIN
    SET NOCOUNT ON;

    DECLARE @data XML;
    DECLARE @schema sysname;
    DECLARE @object sysname;
    DECLARE @eventType sysname;

    --DDL Event i alıyoruz. Daha sonra DDL Event teki bilgileri değişkenleri alacağız.
    SET @data = EVENTDATA();
    SET @eventType = @data.value('(/EVENT_INSTANCE/EventType)[1]', 'sysname');
    SET @schema = @data.value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname');
    SET @object = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname') 

    IF @object IS NOT NULL
        PRINT '  ' + @eventType + ' - ' + @schema + '.' + @object;
    ELSE
        PRINT '  ' + @eventType + ' - ' + @schema;

    IF @eventType IS NULL
        PRINT CONVERT(nvarchar(max), @data);
	
	--Log ları tuttuğumuz tabloya DDL Event i yazıyoruz.
    INSERT [dbo].[DatabaseLog] 
        (
        [PostTime], 
        [DatabaseUser], 
        [Event], 
        [Schema], 
        [Object], 
        [TSQL], 
        [XmlEvent]
        ) 
    VALUES 
        (
        GETDATE(), 
        CONVERT(sysname, CURRENT_USER), 
        @eventType, 
        CONVERT(sysname, @schema), 
        CONVERT(sysname, @object), 
        @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)'), 
        @data
        );
END;
GO

 

Şimdi Trigger ı tetikleyecek bir işlem yapalım. Örneğin yeni bir table create edelim ve bunun loglandığını izleyelim.

USE [dbDDLEventLog]
GO
CREATE table ddlDeneme (a int, b varchar(10))
GO

 

Log ların tutulduğu tabloya bakalım bu event gelmiş mi?

USE [dbDDLEventLog]
GO
select * from DatabaseLog
GO

 

Gördüğünüz gibi table create işlemi loglandı. Sonuca bakacak olursak TSQL kolonunda işlemin TSQL komutu bulunmakta. XMLEVent kolonunda ki veriye tıklarsak yeni bir ekranda yapılan işlemin xml kodunu dökmekte.

<EVENT_INSTANCE>
  <EventType>CREATE_TABLE</EventType>
  <PostTime>2010-06-13T22:06:26.080</PostTime>
  <SPID>55</SPID>
  <ServerName>FUNNYCIK\S10ENT</ServerName>
  <LoginName>funnycik\tugi</LoginName>
  <UserName>dbo</UserName>
  <DatabaseName>dbDDLEventLog</DatabaseName>
  <SchemaName>dbo</SchemaName>
  <ObjectName>ddlDeneme</ObjectName>
  <ObjectType>TABLE</ObjectType>
  <TSQLCommand>
    <SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />
    <CommandText>CREATE table ddlDeneme (a int, b varchar(10))
</CommandText>
  </TSQLCommand>
</EVENT_INSTANCE>

Bu xml kod da işlemle alakalı bütün detaylı bilgiyi bulabilirsiniz.

Table sonucu gelen veri için kolon açıklamalarını da yazıp yazımızı noktalayalım.

DatabaseLogID Table için primary key
PostTime İşlemin yapıldığı zaman
DatabaseUser İşlemi yapan user
Event İşlem Tipi (DDL Event Type)
Schema İşlemin hangi schema da yapıldığı
Object İşlemin hangi obje üzerinde yapıldığı
TSQL işlemin TSQL kodu
XmlEvent İşlemin XML Event i

 

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server 2008 kurulumunun anlatıldığı bu video da şu ana başlıklar işlenecektir.

  • SQL Server 2008 Edition ları
  • Edition lar arasındaki farklılıklar
  • Hardware gereksinimleri
  • SQL Server 2008 Kurulumu
  • SQL Server Configuration Manager
  • SQL Server Management Studio
  • SQLCMD
  • PowerShell

Daha sonraki video larımda SQL Server 2005 Cluster ve SQL Server 2008 Cluster kurulumlarını anlatıyor olacağım.

İyi Seyirler

SQL Server 2008 Kurulum (Standalone Installation) from Turgay Sahtiyan on Vimeo.

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Master database SQL server ın en önemli sistem database i olduğu için backup stratejimizi kesinlikle dahil etmeliyiz.

Makaleme devam etmeden önce sistem database leri ile alakalı yazdığım aşağıdaki yazılarımı okumanızı tavsiye ederim.

SQL Server Sistem Veritabanları
TempDB Database File larını Taşımak
Master DB Database File larını Taşımak

Dediğimiz gibi master DB SQL Server ın en core sistem database idir. Zarar gördüğü durumlarda SQL Server service i restart olamaz.

Peki master DB ne gibi bilgiler içerir. Aşağıda ufak bir özetine geçiyorum.

  • Login Nesneleri
  • Sistem Konfigurasyon Bilgileri
  • Endpoint ler
  • User Database Bilgileri
  • Servis in restart olması için gerekli bilgiler

Dolayısıyla master DB nin backup stratejisi içine dahil edilmesi çok yerinde bir hareket olacaktır. SQL Server da SQL Agent ile otomatik backup alma ile alakalı yazıma aşağıdaki linkten erişebilirsiniz.
SQL Server 2008 de Otomatik BackUp için Job Oluşturma (Schedule)

Bu arada not olarak verelim; master DB nin sadece full backup ı alınabilmektedir. Differential yada TLog backup ı alınamaz.

 

Master Database Full Backup


Master DB nin full backup ının alınması diğer User Database ler ile aynıdır. Örneğin aşağıdaki kod ile master DB nin backup ını c:\ root una alalım.

BACKUP DATABASE [master] TO DISK = N'c:\masterbackup.bak' 
GO

 

Master Database Restore


Master DB backup landıktan sonra master DB yi etkileyen bazı değişiklikler yapıldıysa bunlar ne yazık ki restore edilemeyecektir.

Örneğin Backup tan sonra user create edildiyse Restore işleminden sonra bu user lar tekrar create edilmesi gerekmektedir.

Yada Database create edildiyse restore işleminden sonra bu database leri attach etmek en mantıklı yoldur. Eğer bu konuda bilgi almak isterseniz Attach işlemi ile alakalı yazımı okuyabilirsiniz.

Şimdi master DB nin restore adımlarına bakalım

  1. Service i stop ediniz. Bunun için command prompt ta aşağıdaki kodu kullanabilirsiniz.
    net stop MSSQLSERVER
  2. Service i single-user mode da start ediniz.
    Default instance için command prompt ta aşağıdaki kodu kullanabilirsiniz.
    sqlservr.exe –m
    Named instance için ise command prompt ta aşağıdaki kodu kullanabilirsiniz.
    sqlservr.exe -m -s <instancename>
  3. Şimdi restore işlemini yapacağız. Bu işlemi sqlcmd ile command prompt tan gerçekleştireceğiz. Aşağıdaki SQL script i command prompt ta sqlcmd den sonra çalıştırınız.
    SQLCMD
    RESTORE DATABASE master FROM DISK = 'c:\masterbackup.bak' WITH REPLACE;
    GO
  4. Restore işleminden sonra SQL Server service i stop olup sqlcmd nin çalıştığı ekran kapanacaktır.
  5. SQL Server ı start edin
    net start MSSQLSERVER


İyi Çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Table dan table a veri aktarmanın oldukça fazla yöntemi vardır. Örneğin script ile, SSIS paketi ile, create script ile table dan table a veri aktarmak mümkündür.

Bugün kü yazımda bu aktarım çeşitlerinden script ile aktarım la alakalı olan 2 aktarım şekline bakacağız.

Ayrıca scriptle veri aktarım da eğer hedef table da identity kolon var ise özel bir durum oluşmaktadır. Bunuda inceliyor olacağız.

 

Birinci aktarım yönteminde her 2 table ın sistemde olduğu duruma bakıyor olacağız. Aşağıda script te bu aktarımın nasıl yapıldığına bakabilirsiniz.

create table table1(col1 int,col2 varchar(10))
GO
create table table2(col1 int,col2 varchar(10))
GO

insert table1
values (1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e')
GO

--table 1 den veriler table 2 ye aktarılıyor.
insert table2
  select * from table1
GO

Select * from table2
GO

 

2.Aktarım modelinde ise hedef tablo sistemde bulunmuyor ve biz aktarım komutuyla aynı anda table ı create ederken aynı andada verileri taşıyoruz. Hedef table aktarılan bilgiler ne ise onların data type ları göz önünde bulundurularak create edilir. Bu aktarım script ine aşağıda erişebilirsiniz.

create table table3(col1 int,col2 varchar(10))
GO

insert table3
values (6,'f'),(7,'g'),(8,'h'),(9,'i'),(10,'j')
GO

--table 4 create edilmemiş olmasına rağmen aşağıda aktarım script iyle hem create ediyoruz hemde dataları aktarıyoruz.
select * into table4 from table3
GO

Select * from table4
GO

 

Son olarak hedef tabloda eğer identity (otomatik artan) kolon varsa nasıl bir aktarım script i oluşturmalıyız bunu inceliyor olacağız.

Önce tabloları create edelim ve ilk tablonun içini dolduralım. Her 2 tablonun ilk kolonu identity yani otomatik artan olarak set edilmiş.

create table table5(col1 int identity,col2 varchar(10))
GO
create table table6(col1 int identity,col2 varchar(10))
GO

insert table5
values ('a'),('b'),('c'),('d'),('e')
GO

 

Identity kolonlara identity i off yapmadan kayıt insert edilemez. Edilmeye çalışıldığında aşağıdaki gibi bir hata alınır.

insert table6
  select * from table5
GO

 

Msg 8101, Level 16, State 1, Line 1
An explicit value for the identity column in table 'table6' can only be specified when a column list is used and IDENTITY_INSERT is ON.


Insert edebilmek için ya col1 insert listesinden çıkarılmalı yada table6 ın identity si off yapılmalıdır. Her 2 örneğede bakalım.

Col1 insert listesinden çıkarılır. Bu durumda hedef tablonun col1 i kendi sequence inde devam eder.

insert table6(col2)
  select col2 from table5
GO

Select * from table6
GO

 

Identity insert on yapılır. Bu durumda identity kolon kaynak tabloda olduğu gibi hedef tabloya atılır.

Delete from table6
GO

SET IDENTITY_INSERT table6 ON
insert table6(col1,col2)
  select col1,col2 from table5
SET IDENTITY_INSERT table6 OFF
GO

Select * from table6
GO

 

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


SQL Server 2008 de Snapshot kullanımını konu alan bu video da şu ana başlıklar dikkate alınmıştır.

  • Snapshot nedir?
  • Hangi amaçla kullanılabilir?
  • Nasıl çalışır?
  • Dikkat edilmesi gereken noktalar
  • Örnekler

Snapshot create kodu;

CREATE DATABASE AdventureWorks_dbss ON
( NAME = AdventureWorks_Data, FILENAME = 'd:\Snapshot\AdventureWorks_data.ss' )
AS SNAPSHOT OF AdventureWorks;
GO


Snapshot tan DB restore kodu

restore database AdventureWorks from database_snapshot='AdventureWorks_dbss'

 

İyi seyirler

SQL Server 2008 de Snapshot Kullanımı from Turgay Sahtiyan on Vimeo.

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Ne çabuk geçmiş zaman.

“Yaptığım çalışmaları başkalarıyla paylaşsam güzel olur” diye düşünüp bu bloğu kurmamın üstünden 1 sene geçmiş.

Bu süreç zarfında farklı konularda toplam 136 yazı yayınlamışım. Oldukça verimli geçmiş yani.

Gün geçtikçede ziyaretçi sayısı artmakta. Buda yazdıklarımın boşa gitmediğini birilerinin işine yaradığını gösteriyor bana.

Daha nice senelere hep beraber.

 

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Bugün karşılaştığım ilginç bir hata mesajından bahsetmek istiyorum.

Instance ımda bulunan bir çok DB yi backuplarken herhangi bir hata almazken 100GB ın üzerinde bulunan bir DB yi backuplarken aşağıdaki hatayı aldım.

"failed with the following error: "A nonrecoverable I/O error occurred on file "C:\Backup\xx.bak" (The specified network name is no longer available.)

Bu hata ilk bakışta disk problemi havası vermekte. Fakat internette kısa bir araştırmadan sonra hatanın disk in bozukluğuyla değil boyut yetersizliği ile alakalı olduğunu gördüm :) İnsan daha mantıklı bir hata verir değil mi:)

Benim açımdan problemin çözümü compress backup kullanmak oldu.

Sizinde aklınızın bir yerinde bulunsun. Bu hatayı alırsanız disk im corrupt oldu diye üzülmeyin:)

Bu arada SQL Server 2008 de table ve backup compress ile alakalı yazımı buraya not düşeyim. Belki daha önce kullanmamış olan arkadaşlarımız vardır.

http://www.turgaysahtiyan.com/post/SQL-Server-2008-de-Table-ve-BackUp-Compression-%28Sc4b1kc4b1stc4b1rma%29.aspx

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Bugün size basit ama bir o kadar hayat ve zaman kurtarıcı bir script type tan bahsedeceğim.

Bir table ımız olduğunu düşünelim. Bu table da kolonlardaki değerleri birbirinin tamamen aynı 1 den fazla satır ver. Ve biz bu satırlardan 1 i hariç tamamını silmek istiyoruz.

Herhangi bir unique ifade oluşturamadığımız için klasik silme yöntemleriyle ya bu kayıtların hepsini silmek zorundayız yada Management Studio üzerinden tek tek silmek istersek aşağıdaki hata mesajını almak zorundayız.

The row value(s) updated or deleted either do not make the row unique or they alter multiple rows

Aşağıdaki kod bloğu bu işlemi nasıl yapabileceğimizi anlatıyor.

USE master
GO

--DB Create Edelim
CREATE DATABASE DB_Delete_Deneme
GO

USE DB_Delete_Deneme
GO

--Table Create Edelim
CREATE TABLE TBL_Delete_Deneme(col varchar(10))
GO

--Table a birbirinin aynısı 3 kayıt ekleyelim
INSERT TBL_Delete_Deneme
VALUES ('Turgay'),('Turgay'),('Turgay')
GO

--Table ı sorgulayıp bu 3 kayıtı görelim
SELECT * FROM TBL_Delete_Deneme
GO

--Eğer bu aşamada 
--DELETE FROM TBL_Delete_Deneme WHERE col='Turgay'
--yazarsak bütün kayıtları sileriz.
--Biz ise sadece 2 kaydı silmek ve geriye 1 kayıt bırakmak istiyoruz.
--Eğer Management Studio üzerinden silmeye çalışırsanız aşağıdaki gibi bir hata alacaksınızdır.
--The row value(s) updated or deleted either do not make the row unique or they alter multiple rows

--Bunun için aşağıdaki kodu kullanabilirsiniz.
--Bu kod gelen result set ilk n kaydını siler.

DELETE TOP (2) FROM TBL_Delete_Deneme WHERE col='Turgay'
GO

--Table ı sorgulayıp tek kayıt kaldığını görelim
SELECT * FROM TBL_Delete_Deneme
GO

--DB yi drop edelim
USE master
GO
DROP DATABASE DB_Delete_Deneme
GO

 

İyi çalışmalar

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan


Bu yazımda Blog Engine kullananların çok hoşuna gideceğini düşündüğüm bir widget tan bahsetmek istiyorum.

Hiyerarşik Category List

image

Bu güzel widget ın yazarı http://blog.brichan.JP/ . Alıntımızı yaptıktan sonra yazımıza dönelim.

Orjinal Blog Engine kodunda hiyerarşik category list bulunmamakta ne yazıkki. Şimdi bunu nasıl yapacağımıza bakalım.

http://www.turgaysahtiyan.com/download/Nested.Cat/zip adresinden dosyaları indirip disk te bir yere açın.

Daha sonra App_Code ve Widgets klasöründe bulunan dosyaları blog unuzda ilgili yerlere kopyalayın.

App_Code/Controls/LayeredPageList.cs
App_Code/Controls/LayeredCategoryList.cs
Widgets/LayeredPageList
Widgets/LayeredCategoryList

Daha sonra orjinal categorylist yerine bu widget ı kullanmak için site.master dosyanızda blog:pagelist geçen yeri blog:layeredpagelist yapın.

Aynı şekilde blog:categorylist geçen yeri blog:layeredcategorylist yapmanız gerekmekte.

Burada dikkat etmeniz gereken, eğer orjinal theme i değil başka bir theme kullanıyorsanız theme klasörünün içindeki kullandığınız theme de ki site.master ı değiştirmeniz gerekir.

Son olarak içeriye doğru dallanma işlemini gerçekleştirmek için css dosyasında değişiklik yapılması gerekmekte. Bunun içinde aşağıdaki kodu css dosyanızda uygun yere yerleştirin.

li.L1 (margin-left: 12px;)
li.L2 (margin-left: 24px;)
li.L3 (margin-left: 36px;)


İşlemler bu kadar. Artık sizde Hiyerarşik Category List in keyfine varabilirsiniz :)


İyi çalışmalar,

Turgay Sahtiyan

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan