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
<<  Haziran 2017  >>
PaSaÇaPeCuCuPa
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789
Keywords

Bugün bir developer arkadaşımın benden istediği script’i sizinle paylaşmak istiyorum.

[more]

İstek şu şekilde; ABC12345 gibi bir string’de bulunan A,B,C gibi AlfaNumeric karakterleri silip sadece 12345’i bırakma.

Bunun için yazmış olduğum function aşağıdaki gibi;

create function dbo.ExcludeChars (@str varchar(max))
RETURNs varchar(max)
AS
BEGIN

declare @ix int=len(@str)
declare @i int=1

declare @newString varchar(max)=''

while @i<=@ix begin
  if ASCII(SUBSTRING(@str,@i,1))>=48 and ASCII(SUBSTRING(@str,@i,1))<=57 
    select @newString=@newString+SUBSTRING(@str,@i,1)
  set @i=@i+1
end

return @newString

END

 

Kullanımı da şu şekilde;

select dbo.ExcludeChars('ABC12345')

 

İ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


12 Ocak Çarşamba günü yapmış olduğum webcast’te kullandığım powerpoint dosyasını ve scriptleri sizinle paylaşmak istiyorum.

İlerleyen günlerde webcast’i video formatında da paylaşıyor olacağım.

[more]

PowerPoint Dosyası

http://www.turgaysahtiyan.com/file.axd?file=2011%2f01%2fMSSQL_2008_BPA_Sunum.pptx

Sunumda Kullanılan Scriptler

--Engine - Databases using simple recovery model
--Recovery Model'i simple olan databaseler
Select *
from sys.databases
where recovery_model_desc='SIMPLE' and database_id>4

--Engine – Backups outdated for databases
--Son Backup Alma Zamanları ve Backup Alınan Yerler
SELECT xx.*,T3.physical_device_name FROM
(
SELECT
T1.Name as DatabaseName,MAX(T2.backup_finish_date) as backup_finish_date,
COALESCE(Convert(varchar(12), MAX(T2.user_name), 101),'NA') as UserName
FROM sys.sysdatabases T1
LEFT OUTER JOIN msdb.dbo.backupset T2 ON T2.database_name = T1.name
where T1.dbid>4
GROUP BY T1.Name
)xx
LEFT OUTER JOIN msdb.dbo.backupset T2 ON T2.database_name = xx.DatabaseName and T2.backup_finish_date=xx.backup_finish_date
LEFT OUTER JOIN msdb.dbo.backupmediafamily T3 ON T3.media_set_id = T2.media_set_id
ORDER BY xx.DatabaseName

--Engine - Database files and backup files exist on the same volume
--Datanın bulunduğu yer ile backup ın alındığı yer aynı olan DB'ler
WITH CTE 
AS
(
select DB_NAME(mf.database_id) as DBName
	,LEFT(mf.physical_name,1) as DBFilesFolder 
	,LEFT(bmf.physical_device_name,1) as LastBackupFolder
	,bs.backup_finish_date as LastBackupDate
	,ROW_NUMBER() OVER (PARTITION BY DB_NAME(mf.database_id) ORDER BY bs.backup_finish_date desc) AS RowNumber
from sys.master_files mf
LEFT OUTER JOIN msdb.dbo.backupset bs ON bs.database_name = DB_NAME(mf.database_id) 
LEFT OUTER JOIN msdb.dbo.backupmediafamily bmf ON  bmf.media_set_id = bs.media_set_id
where database_id>4
group by database_id, LEFT(mf.physical_name,1),LEFT(bmf.physical_device_name,1),backup_finish_date
)
Select DBName,DBFilesFolder,LastBackupFolder,LastBackupDate 
from CTE 
where RowNumber=1 and DBFilesFolder=LastBackupFolder

--Engine – Database consistency check not current
--En son sağlıklı DBCC CheckDB Tarihi kontrolü
--dbi_dbccLastKnownGood
DBCC DBINFO('AdventureWorks') WITH TABLERESULTS 

--Engine - Missing Tempdb errors fix or trace flag
--SQL Server Service Pack'ini sorgulamak
select SERVERPROPERTY('ProductLevel')

--Engine – SQL Server tempdb database not configured optimally
--TempDB data file'ları ve boyutları
select DB_NAME (database_id) as DBName
      ,name
      ,Size/128 as Size_MB
from sys.master_files
where database_id=2 and type=0

--Core CPU sayısı
select cpu_count from sys.dm_os_sys_info

--Engine – SQL Server Admin role membership check
--sysadmin listesi
SELECT
p.name AS [Name]
FROM
sys.server_principals r
INNER JOIN sys.server_role_members m ON r.principal_id = m.role_principal_id
INNER JOIN sys.server_principals p ON
p.principal_id = m.member_principal_id
WHERE r.type = 'R' and r.name = N'sysadmin' 

 

İ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 2011 “Denali” ile gelen çok güzel özelliklerden biride Contained Database mantığı. Contained Database ile database engine’den izole edilmiş bir database oluşturabilir ve instance’lar arasında sıkıntısız bir şekilde taşıma işlemi gerçekleştirebiliriz.

[more]

Hepimizin başına gelmiştir. A server’ında bulunan bir DB’yi B server’ına backup-restore ya da detach-attach metodu ile taşıdıktan sonra kullanıcıların gelmediğini görürüz ve bu kullanıcıları şifreleri ile beraber taşımak zorunda kalırız. Ya da kullanıcılar orphaned olarak kalır ve ekstra işlem yapmamız gerekir. Bunun nedeni login’lerin server seviyesinde saklanıyor olması ve authentication’ın server side’da yapılıyor olmasıdır.

Contained Database ise database’in tanımlanması için gerekli olan bütün metadata bilgilerini ve database özelliklerini kendi üzerinde tutar. Bu tarz database’lerde login’ler database engine level’ında authenticate olmazlar. User bilgileri database içerisinde saklanır. Bu şekilde database engine’den izole edilmiş olan database, server’lar arasında çok rahat bir şekilde taşınır ve ekstra yapılacak işlem sayısı çok aza indirilir.

SQL Server Denali ile beraber CONTAINMENT tipi olarak 2 seçenek gelmektedir. Bunlar Full ve Partial Containment’tır. Fakat CTP1’de şu an için sadece Partial Containment type’ı kullanabilmekteyiz.

Sunucuda Contained Database kullanabilmek için server side option olan “contained database authentication” özelliğinin true yapılması gerekmektedir. Bu özelliği hem SSMS’den hem de query ile yapmamız mümkün.

T-SQL ile Contained Database Özelliğinin Enable Edilmesi

Aşağıdaki script ile yapabilirsiniz.

sp_configure 'show advanced options', 1 ;
GO
RECONFIGURE ;
GO
sp_configure 'contained database authentication', 1;
GO
RECONFIGURE ;
GO
sp_configure 'show advanced options', 0 ;
GO
RECONFIGURE ;
GO

 

SSMS ile Contained Database Özelliğinin Enable Edilmesi

SSMS’te server adına sağ tıklayıp properties kısmına geçelim. Advanced tab’ında bulunan Containment kısmında Enable Contained Databases özelliğini True yapalım.

image_13

Contained Database Oluşturma

Gene hem T-SQL ile hem de SSMS ile bu işlemi yapabiliriz. SSMS ile yaparken standart olarak new database ekranını açalım ve Options kısmına geçelim.

Burada gördüğünüz gibi Containment Type adında yeni bir özellik eklenmiş durumda. Bu kısımdan containment’ın tipini full ya da partial olarak seçebiliriz. Dediğim gibi CTP1 de sadece partial desteklenmekte.

image_14

Containment type’ı değiştirdiğimizde alt tarafta bulunan Containment kısmının aktif olduğunu görüyoruz. Burada bulunan 5 özelliği bu DB’ye özel tanımlayarak server’dan izole edebiliriz.

Örneğin Server’ın Default Language’ı Turkish’ken Contained DB’nin Default Language’ını English yapmamız mümkün. Bu durumda bu DB’yi başka bir server’a taşıdığımızda gene bu özellikler ile taşınmış olacaktır.

Contained Olmayan Bir DB’ye Contained Hale Dönüştürme

Gene bu işlemi bir önceki adımda anlattığım gibi SSMS arayüzünde Database özelliklerinden yapabilirsiniz. Ya da aşağıdaki script ile bu işlemi yapmanız mümkün.

USE [master]
GO
ALTER DATABASE [SampleDB1] SET CONTAINMENT = PARTIAL
GO

 

Bir sonraki yazımda Contained Database’lerde user’ların DB Engine bağımsız nasıl tanımlanacağına bakıyor olacağız.

 

İ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 2011 “Denali” ile gelen bir diğer özellik ise Code Snippets yani code parçacıklarını template olarak kaydedip kullanabilme. Ufak bir özellik gibi görünmesine rağmen, code snippets kullanımı çok fazla kod geliştiren developerların işlerini oldukça hızlandırmakta.

[more]

Denali’den önce Template Explorer’ı code snippets mantığında kullanıyorduk.

Fakat Code Snippets ile gelen Intellisense özelliği Code Snippets’ı bir adım öne çıkarmakta.

Ayrıca bir diğer güzel özelliği, kendi tanımladığımız Snippet’ları kendi local makinamızda saklamak zorunda değiliz. Ortak bir folder’da saklayarak takım arkadaşlarımız ile ortak olarak kullanabiliriz.

Şimdi örneklerimize geçelim.

Tanımlı Bir Code Snippets’ı Çağırma

  1. Yeni bir query ekranı açalım.
  2. Snippet’ı 2 farklı şekilde çağırabiliriz. İlki menuden Edit >> Intellisense >> Insert Snippet kısmı. 

    image_3
  3. Diğer çağırma yöntemi ise Ctrl+K ve Ctrl+X tuş kombinasyonlarına arka arkaya basmak. Bu yöntem daha kullanışlı gibi.
  4. 2 çağırma yönteminden birini kullandığımızda aşağıdaki gibi intellisense kısmı açılmakta. 

    image_4
  5. Buradan ilgili kategoriden ilgili snippet’i intellisense kullanarak buluyoruz. 

    image_5
  6. Enter’a bastığımızda ilgili snippet query ekranına gelmekte. 

    image_6

Kendi Snippet’imizi Oluşturup Kullanalım

Bu bölümde yeni bir snippet tanımlayıp bunu intellisense vasıtasıyla kullanmaya göreceğiz.

Örneğin aşağıdaki paging script’i için bir snippet hazırlayalım.

SELECT *
FROM Sales.SalesOrderHeader soh
ORDER BY soh.SalesOrderID ASC
	OFFSET 100 ROWS
	FETCH NEXT 50 ROWS ONLY;

Bu kodu XML olarak şu şekilde hazırlayıp snippet uzantısı ile kaydediyoruz.

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<_locDefinition xmlns="urn:locstudio">
<_locDefault _loc="locNone" />
<_locTag _loc="locData">Title</_locTag>
<_locTag _loc="locData">Description</_locTag>
<_locTag _loc="locData">Author</_locTag>
<_locTag _loc="locData">ToolTip</_locTag>
</_locDefinition>
<CodeSnippet Format="1.0.0">
<Header>
<Title>Paging</Title>
<Shortcut></Shortcut>
<Description>Paging</Description>
<Author>Turgay Sahtiyan</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>SchemaName</ID>
<ToolTip>Name of the schema</ToolTip>
<Default>dbo</Default>
</Literal>
<Literal>
<ID>Tablename</ID>
<ToolTip>Name of the table</ToolTip>
<Default>Sample_Table</Default>
</Literal>
<Literal>
<ID>ColumnName</ID>
<ToolTip>Name of the order column</ToolTip>
<Default>column_1</Default>
</Literal>
<Literal>
<ID>Number1</ID>
<ToolTip>OFFSET Number</ToolTip>
<Default>100</Default>
</Literal>
<Literal>
<ID>Number2</ID>
<ToolTip>FETCH Number</ToolTip>
<Default>50</Default>
</Literal>
</Declarations>
<Code Language="SQL">
<![CDATA[
SELECT *
FROM $SchemaName$.$Tablename$
ORDER BY $ColumnName$ ASC
OFFSET $Number1$ ROWS
FETCH NEXT $Number2$ ROWS ONLY;
]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>

Bu XML’i Paging.snippet olarak kaydedelim.

Daha sonra kaydettiğimiz bu snippet’i snippet listesine eklemek için Tools >> Code Snippets Manager menüsünü açalım.

image_7

image_8

Add kısmından snippet’ın olduğu klasörü ekleyelim.

image_9

Hazırladığımız Snippet MySnippets kısmında gözükmekte.

image_10

Şimdi bunu intellisense vasıtasıyla kullanalım.

Yeni bir query ekranı açalım ve Ctrl+K – Ctrl+X tuş kombinasyonlarına sırasıyla basarak intellisense yardımıyla snippet’imizi bulalım.

image_11

Enter’a basalım.

image_12

 

İ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 2011 “Denali” ile gelen bir diğer özellik de Sequence Objects yani Sıralama objesi. Table’larda bulunan Identity kolonuna çok benzeyen Sequence ile otomatik artan sayılar oluşturmak mümkün. Identity’den en büyük farkı ise bir tablo ile sınırlı kalmaması, istenirse 5 tablo için aynı sequence object’in kullanılabilmesi.

[more]

Bir örnek vererek neden böyle bir object’e ihtiyaç duyduğumuzu açıklamaya çalışalım. Örneğin bir ticari program yapıyorsunuz ve bu ticari programda internet üzerinden ve perakende olarak satış yapma opsiyonları var. Ve siz bu 2 satış şeklini farklı tablolarda tutuyorsunuz. Burada istediğiniz farklı tablolarda tutulsalar dahi satışların birbirini takip eden numaraları ID olarak alması.

Identity ile bunun yapılması mümkün değil. Çünkü Identity kolonuna table içinde kullanılmakta ve 1 table sınırlı olmaktaydı. Sequence ile bu isteği karşılamamız mümkün.

Bunun ötesinde aşağıdaki durumlarda Sequence Object kullanma ihtiyacınız doğabilir.

  • Insert’ten önce otomatik artan ID bilgisine ihtiyacınız varsa.
  • Otomatik artan sayıyı birden fazla tabloda ortak kullanmak istiyorsanız.
  • Belirli bir rakama erişildiğinde otomatik artan sayının başa dönmesi isteniyorsa.
  • Otomatik artan sayının artma miktarı gibi özelliklerini değiştirmek istiyorsanız.

Şimdi örnek kullanımlara geçelim.

2 Tablo için Ortak Sequence Object Kullanımı

Bu örneğimizde Internet Satışları ve Perakende Satışları için ortak bir otomatik artan sayı kullanmaya çalışacağız.

--Sequence Object'i oluşturalım
CREATE SEQUENCE SeqSalesID
    AS int
    START WITH 1
    INCREMENT BY 1 ;
GO

--Internet satışlarını tuttuğumuz tablo
CREATE TABLE InternetSales
(
    SalesID int PRIMARY KEY CLUSTERED 
        DEFAULT (NEXT VALUE FOR SeqSalesID),
    SalesDate date NOT NULL DEFAULT (getdate()),
    SalesAmount float NOT NULL
) ;
GO

--perakende satışları tuttuğumuz tablo
CREATE TABLE RetailerSales
(
    SalesID int PRIMARY KEY CLUSTERED 
        DEFAULT (NEXT VALUE FOR SeqSalesID),
    SalesDate date NOT NULL DEFAULT (getdate()),
    SalesAmount float NOT NULL
) ;
GO

--Satış yapalım
INSERT InternetSales (SalesDate, SalesAmount) 
    VALUES (GETDATE(), 150) ;
INSERT InternetSales (SalesDate, SalesAmount) 
    VALUES (GETDATE(), 350) ;
INSERT RetailerSales (SalesDate, SalesAmount) 
    VALUES (GETDATE(), 350) ;
INSERT InternetSales (SalesDate, SalesAmount) 
    VALUES (GETDATE(), 350) ;
INSERT RetailerSales (SalesDate, SalesAmount) 
    VALUES (GETDATE(), 550) ;


-- UNION ALL ile sorgu çekelim ve otomatik artan sayıya bakalım.
SELECT SalesID, SalesDate, SalesAmount FROM InternetSales
UNION ALL
SELECT SalesID, SalesDate, SalesAmount FROM RetailerSales
ORDER BY SalesID ;
GO

--Oluşturduğumuz objeleri drop edelim
DROP Table InternetSales
DROP Table RetailerSales
DROP SEQUENCE SeqSalesID

Sorgu sonucu şu şekilde olacaktır.

image_1

Gördüğünüz gibi SalesID 2 farklı tablo içinde birbirini takip etmekte.

Tekrarlayan Sequence Object

Bu örneğimizde 10 a geldiğinde tekrar başa dönen bir Sequence oluşturacağız.

CREATE SEQUENCE CountBy10
   AS tinyint
    START WITH 1
    INCREMENT BY 1
    MINVALUE 1
    MAXVALUE 10
    CYCLE ;
GO

SELECT NEXT VALUE FOR CountBy10 AS ID, Name FROM sys.objects ;
GO

DROP SEQUENCE CountBy10
GO

image_2

Gördüğünüz gibi otomatik artan sayı 10 a kadar sayıp tekrar başa dönüp 1 den başladı.

Sequence Object’i Resetlemek

Aşağıdaki kod ile Sequence Object’i drop-create etmeden istediğimiz bir numaradan tekrar başlatabiliriz. Bunu Identity için ReSeed komutuna benzetebiliriz.

ALTER SEQUENCE Samples.IDLabel
RESTART WITH 1 ;

Gördüğünüz gibi Sequence’i farklı amaçlar için kullanmak mümkün. Identity’e oranla daha fazla esneklik sağlayan Sequence Objesinin ilerleyen günlerde çok daha sıklıkla kullanılacağını düşünüyorum.

İ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 11 “Denali” ile gelen yeni özelliklerden biride Query’lerde Paging ya da sayfalama yapabilme opsiyonu. Denali’den öncede bazı yöntemlerle paging yapılabilmekteydi ama yeni gelen syntax’la bu işlemi yapabilmek artık çok daha kolay.

[more]

İlk olarak Denali’den önce bu işlemin nasıl yapıldığına bakalım.

Örneğin aşağıdaki sorgu Satış tablosundaki verilerin 100 ile 150 arasındaki kayıtlarını getirmekte. Yani her sayfada 50 kayıt bulunuyorsa 3.sayfayı getirmeye çalışıyoruz.

SELECT * FROM (
SELECT *
    ,ROW_NUMBER() OVER (ORDER BY soh.SalesOrderID) AS 'RowNumber'
FROM Sales.SalesOrderHeader soh
) Tbl1
WHERE RowNumber>100 and RowNumber<=150

Denali’de ise şu syntax ile paging yapabilmekteyiz.

SELECT *
FROM Sales.SalesOrderHeader soh
ORDER BY soh.SalesOrderID ASC
    OFFSET 100 ROWS
    FETCH NEXT 50 ROWS ONLY;

Bir de bunu SP’ye dönüşterelim ve her sayfada kaç row var, kaçıncı sayfayı istiyoruz parametrelerini göndererek sorguyu çekelim.

CREATE PROCEDURE dbo.spGetSales
(
    @PageNumber int = 1,
    @RowCountInPage int = 50
)
AS
BEGIN
	SELECT *
	FROM Sales.SalesOrderHeader soh
	ORDER BY soh.SalesOrderID ASC
		OFFSET (@PageNumber-1)*@RowCountInPage ROWS
		FETCH NEXT @RowCountInPage ROWS ONLY;
END

SP’yi çağıralım. Her sayfada 50 kayıt var, 3. sayfayı almak istiyorum.

exec dbo.spGetSales 3,50

İ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


Arkadaşlar bugün 21:00-22:00 saatleri arasında yapılacak Wordpress Kullanımı ve Güvenliği webcast’ini anons etmek istiyorum. Detay bilgiler aşağıdaki gibidir.

Webcast Perşembe
Konu Wordpress Kullanımı ve Güvenliği
Konuşmacı Bora Yıldız
Başlama zamanı 27 Ocak 2011, Perşembe, 21:00
Bitiş zamanı 27 Ocak 2011, Perşembe, 22:00
Katılım bağlantısı

http://connect.e-sertifika.com.tr/cozumpark

 

Vaktiniz varsa katılmanızı tavsiye ederim.

İ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 sizlerle paylaşacağım script ile sunucuda bulunan bütün DB’ler için hangi user’ların db_owner grubunda olduğunu sorgulayabilirsiniz.

[more]

Script aşağıdaki gibi;

CREATE TABLE #tmp_result (DBName sysname, name sysname)

exec sp_msforeachdb '
set NOCOUNT OFF
use ?;
CREATE TABLE #tmp_role_member_ids (id int not null, role_id int null, sub_role_id int null, generation int null)
declare @generation int
set @generation = 0
INSERT INTO #tmp_role_member_ids (id) SELECT
rl.principal_id AS [ID]
FROM
sys.database_principals AS rl
WHERE
(rl.type = ''R'')and(rl.name=''db_owner'')
UPDATE #tmp_role_member_ids SET role_id = id, sub_role_id = id, generation=@generation
WHILE ( 1=1 )
BEGIN
	INSERT INTO #tmp_role_member_ids (id, role_id, sub_role_id, generation)
		SELECT a.member_principal_id, b.role_id, a.role_principal_id, @generation + 1
            FROM sys.database_role_members AS a INNER JOIN #tmp_role_member_ids AS b
			ON a.role_principal_id = b.id
            WHERE b.generation = @generation
	if @@ROWCOUNT <= 0
		break
	set @generation = @generation + 1
END
DELETE #tmp_role_member_ids WHERE id in (SELECT
rl.principal_id AS [ID]
FROM
sys.database_principals AS rl
WHERE
(rl.type = ''R'')and(rl.name=''db_owner'') )
UPDATE #tmp_role_member_ids SET generation = 0;
INSERT INTO #tmp_role_member_ids (id, role_id, generation) 
    SELECT distinct id, role_id, 1 FROM #tmp_role_member_ids
DELETE #tmp_role_member_ids WHERE generation = 0

INSERT #tmp_result
SELECT
db_name(),
u.name AS [Name]
FROM
sys.database_principals AS rl
INNER JOIN #tmp_role_member_ids AS m ON m.role_id=rl.principal_id
INNER JOIN sys.database_principals AS u ON u.principal_id = m.id
WHERE
(rl.type = ''R'')and(rl.name=''db_owner'')
ORDER BY
[Name] ASC

drop table #tmp_role_member_ids
'

select *,'use '+DBName+'; EXEC sp_droprolemember N''db_owner'', N'''+Name+''' ' as DropScript 
from #tmp_result

drop table #tmp_result

 

Örnek çıktı aşağıdaki gibi;

a

Drop script kolonunda ilgili yetkiyi kaldırabilmek için gerekli script’i bulabilirsiniz.

 

İ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


Aslında problem sadece 2008’den 2005’e taşımak ile sınırlı değil. Bildiğiniz gibi major üst versiyonlarda oluşturulmuş bir database’i daha alt bir versiyona backup-restore ya da detach-attach ile taşıyamıyoruz.

Bugünkü yazımda bu konuya bir çözüm bulup adım adım bu taşıma işleminin nasıl yapılacağına bakıyor olacağız.

[more]

Giriş paragrafında da belirttiğim gibi konu sadece 2008’den 2005’e taşımak ile ilgili değil. 2008R2’dan 2008’e ya da 2008’den 2000’e yapılan backup-restore ya da detach-attach işlemlerinde de hata alınmaktadır.

Örneğin alınan hatalar şu şekilde;

2008’den 2005’e backup restore;

Msg 3241, Level 16, State 7, Line 2
The media family on device 'D:\dbDeneme2008_2.bak' is incorrectly formed. SQL Server cannot process this media family.
Msg 3013, Level 16, State 1, Line 2
RESTORE DATABASE is terminating abnormally.

2008’den 2005’e detach attach;

The database 'XXX' cannot be opened because it is version 655. This server supports version 612 and earlier. A downgrade path is not supported.
Could not open new database 'XXX'. CREATE DATABASE is aborted. (Microsoft SQL Server, Error: 948)

Şimdi çözüme geçelim;

Generate Script ile 2008’den 2005’e Database Taşıma

Ben örneğimi 2008’den 2005’e taşıma olarak yapacağım. Siz aynı mantıkta diğer versiyonlar arası da taşıma yapabilirsiniz.

Önce her zamanki gibi bir çalışma DB’si create edelim. Bu DB’yi 2008 sunucumda create ediyorum.

create database dbDeneme2008
GO
Use dbDeneme2008
GO
create table tblDeneme2008 (a int)
GO
insert tblDeneme2008 select 1
GO

 

Şimdi taşıma adımlarına geçelim

  1. 2008 sunucusunda bulunan taşınacak DB’ye sağ tıklayıp Tasks >> Generate Scripts bölümüne geliyoruz.
  2. Açılan ekranda next yapıp gelen ekranda çalışmak istediğimiz veritabanını seçiyoruz. Yani bu örnek için dbDeneme2008. Next’e tıklıyoruz. 

    1
  3. Script Version kısmında SQL Server 2005 ve Script Data kısmında True seçerek Next’e tıklıyoruz. 

    2

    3 
  4. Choose Object Types kısmından ilgili objeleri seçiyoruz. (SP,Function,Table,View vs.) Bu Örneğimizde sadece table olduğu için tables’ı seçip next’e basıyoruz. 

    4
  5. Tüm table’ları seçiyoruz ve next’e basıyoruz. 

    5
  6. Script’i file’a save etmek istediğimizi belirtip next’e basıyoruz. 

    6
  7. Summary kısmında yaptığımız işlemin bir özetini görüyoruz. 

    7
  8. Finish’e basarak işlemi sonlandırıyoruz. 

    8
  9. 2005 sunucuya geçip dbDeneme2008 adlı yeni bir boş DB create ediyoruz.
    create database dbDeneme2008
    GO
  10. 8. Adım sonucunda oluşan script’i 2005 sunucusunda execute ediyoruz. 

    9
  11. İşlem tamamlandı. 2005 sunucusunda oluşan DB’ye baktığımızda table’ların ve dataların geldiğini göreceğiz. 

    10

Bu makalemizde 2008’den 2005’e bir Database’i generate script metodu ile nasıl taşıyabileceğimizi gördük.

 

İ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 R2 ya da daha üst bir versiyonda oluşturulmuş bir database’i detach edip 2008 Server’a attach etmeye çalıştığınızda aşağıdaki gibi bir hata alabilirsiniz.

[more]

The database 'dbDenemeR2' cannot be opened because it is version 661. This server supports version 655 and earlier. A downgrade path is not supported.

Could not open new database 'dbDenemeR2'. CREATE DATABASE is aborted. (Microsoft SQL Server, Error: 948)

image

Bu hatanın sebebi üst versiyondan oluşturulan bir database’in daha alt bir SQL Server versiyonuna attach edilememesidir.

Böyle bir durumda aşağıdaki makaleyi kullanarak 2008 R2 DB’nizi SQL Server 2008’e taşıyabilirsiniz.

SQL Server 2008’de Bulunan Bir Database’i SQL Server 2005’e Taşımak (Restore)

 

İ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 R2 ya da daha üst bir versiyondan aldığınız bir backup’ı SQL Server 2008’e restore etmeye çalıştığınızda aşağıdaki gibi bir hata alabilirsiniz.

[more]

Msg 3169, Level 16, State 1, Line 1
The database was backed up on a server running version 10.50.1600. That version is incompatible with this server, which is running version 10.00.2531. Either restore the database on a server that supports the backup, or use a backup that is compatible with this server.
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.

image

Bu hatanın sebebi üst versiyondan alınan backup dosyasının daha alt bir SQL Server versiyonuna restore edilememesidir.

Böyle bir durumda aşağıdaki makaleyi kullanarak 2008 R2 DB’nizi SQL Server 2008’e taşıyabilirsiniz.

SQL Server 2008’de Bulunan Bir Database’i SQL Server 2005’e Taşımak (Restore)

 

İ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 ya da daha üst bir versiyonda oluşturulmuş bir database’i detach edip 2005 Server’a attach etmeye çalıştığınızda aşağıdaki gibi bir hata alabilirsiniz.

[more]

The database 'XXX' cannot be opened because it is version 655. This server supports version 612 and earlier. A downgrade path is not supported.
Could not open new database 'XXX'. CREATE DATABASE is aborted. (Microsoft SQL Server, Error: 948)

image

Bu hatanın sebebi üst versiyondan oluşturulan bir database’in daha alt bir SQL Server versiyonuna attach edilememesidir.

Böyle bir durumda aşağıdaki makaleyi kullanarak 2008 R2 DB’nizi SQL Server 2008’e taşıyabilirsiniz.

SQL Server 2008’de Bulunan Bir Database’i SQL Server 2005’e Taşımak (Restore)

 

İ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 ya da daha üst bir versiyondan aldığınız bir backup’ı SQL Server 2005 ya da SQL Server 2000’e restore etmeye çalıştığınızda aşağıdaki gibi bir hata alabilirsiniz.

[more]

Msg 3241, Level 16, State 7, Line 2
The media family on device 'D:\dbDeneme2008_2.bak' is incorrectly formed. SQL Server cannot process this media family.
Msg 3013, Level 16, State 1, Line 2
RESTORE DATABASE is terminating abnormally.

image

Bu hatanın sebebi üst versiyondan alınan backup dosyasının daha alt bir SQL Server versiyonuna restore edilememesidir.

Böyle bir durumda aşağıdaki makaleyi kullanarak 2008 R2 DB’nizi SQL Server 2008’e taşıyabilirsiniz.

SQL Server 2008’de Bulunan Bir Database’i SQL Server 2005’e Taşımak (Restore)

 

İ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


Microsoft’dan gelen bir duyuruyu sizin ile paylaşmak istiyorum.

image

30 Kasım’da İstanbul’da iletişim en yeni boyutu Lync 2010’u duyurduğumuz ve 500’e yakın katılımcıyı ağırladığımız lansman etkinliğimiz bünyesinde birbirinden değerli oturumlarımız gerçekleşti. Eğer bu oturumları izlememek ve sunumlarına erişmek isterseniz, tamamını Microsoft Lync Türkiye sitesinde bulabilirsiniz. Microsoft Lync Türkiye sitesine http://www.microsoft.com/tr-tr/lync/default.aspx adresinden erişebilirsiniz.

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


12 Ocak Çarşamba günü yapacağım webcast’in duyurusunu yapmak istiyorum.

SQL Server 2008 R2 Best Practices Analyzer başlıklı webcast’im 12.01.2011 tarihinde 10:00-11:00 saatleri arasında gerçekleşecek.

Aşağıdaki url’i kullanarak vereceğim bu webcast’e katılabilirsiniz.

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032474078&Culture=TR-TR

[more]

Ajandamız şu şekilde olacak;

  • SQL Server BPA Nedir?
  • Best Practice Kavramı Nedir?
  • Kurulum İşlemleri
  • BPA’yı Network Üzerinden Kullanmak İçin Yapılması Gerekenler
  • BPA’ya Genel Bir Bakış
  • SQL Server 2008 Best Practice’leri
  • Soru – Cevap

Vaktiniz varsa katılmanızı kesinlikle tavsiye ederim.

 

İ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


http://www.microsoft.com/click/areyoucertifiable/

Microsoft tarafından hazırlanan online sertfika sınavlarına hazırlık programı. Windows Live ID iniz ile login olarak veya guest seçenekleri ile girerek size sunulan soruları cevaplıyorsunuz. Windows Live ID niz ile girdiğinizde varsa sertifika sayınız soruluyor ve ilgilendiğiniz sertifika size soruluyor:

[more]

Please indicate the Microsoft certification(s) you earned:
Microsoft Certified Desktop Support Technician (MCDST) Microsoft Certified Professional Developer (MCPD)
Microsoft Certified Systems Administrator (MCSA) Microsoft Certified IT Professional (MCITP)
Microsoft Certified Systems Engineer (MCSE) Microsoft Certified Technology Specialist (MCTS)
Microsoft Certified Database Administrator (MCDBA) Microsoft Certified Trainer (MCT)
Microsoft Certified Application Developer (MCAD) Microsoft Certified Learning Consultant (MCLC)
Microsoft Certified Solution Developer (MCSD) Microsoft Certified Architect (MCA) Program

Daha sonra gelen pencerede aşağıdakilerden birini seçiyorsunuz ve size ilgili konularda sorular geliyor:

Windows 7
IT Fundamentals
IT Professional
Dev Fundamentals
Developer

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


Standalone yani herhangi bir domain’e ait olmayan bir bilgisayarda SQL Server 2008 R2 BPA kurulumu yaparken aşağıdaki gibi bir hata ile karşılaşabilirsiniz.

[more]

There is a problem with this Windows Installer package. A program run as part of the setup did not finish as expected. Contat your support personel or package vendor.

image

Bu hatayı almadan kurulumu sorunsuz bir şekilde yapmak için uygulamanız gereken adımlar aşağıdaki gibi.

  1. Bilgisayarınızda Windows PowerShell 2.0’ın kurulu olduğundan emin olun. Eğer kurulu değilse aşağıdaki adresten indirip kurun.
    http://www.microsoft.com/downloads/en/details.aspx?FamilyID=50633A1F-A665-425D-923C-1A269F8AC084
  2. Windows PowerShell 2.0’ı bir admin account’u ile açın.
  3. Enable-PSRemoting komutunu çalıştırın.
  4. winrm set winrm/config/winrs `@`{MaxShellsPerUser=`"10`"`} komutunu çalıştırın.
  5. Command prompt u açın ve BPA kurulumunu şu şekilde başlatın.
    msiexec /i "C:\Tools\SQL2008R2BPA_Setup64.msi" SKIPCA=1

Bu aşamaları hatasız geçerseniz BPA kurulumunuz sorunsuz tamamlanacaktır.

 

İ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


Sys.dm_exec_query_stats gibi DMV’leri anlatırken ilgili çalışan kod parçacığının sys.dm_exec_sql_text ve start-end offset’ler kullanılarak nasıl okunacağını görmüştük. Bilgilerinizi tazelemek için aşağıdaki makaleleri kullanabilirsiniz.

SQL Server – Her Gün 1 DMV - Gün 2 - sys.dm_exec_sql_text - sys.dm_exec_query_plan

SQL Server – Her Gün 1 DMV - Gün 4 - sys.dm_exec_query_stats ile Query İstatistikleri

Bugünkü makalemde daha yeni yazdığım, dumanı üzerinde tüten, statement text’i döndüren function’ımı paylaşıyor olacağım.:)

[more]

Function şu şekilde;

USE master
GO
-- =============================================
-- Author:		Turgay Sahtiyan
-- Create date: 29.12.2010
-- Description:	Get Statement Text from Given Sql_Handle
-- =============================================
CREATE FUNCTION [dbo].[GetStatementText] 
(
	@sqlHandle varbinary(64), @stmtStart int, @stmtEnd int
)
RETURNS varchar(max)
AS
BEGIN
	DECLARE @Result varchar(max)
    select @stmtStart=isnull(@stmtStart,0)
    select @stmtEnd=isnull(@stmtEnd,-1)
    SELECT @Result = SUBSTRING(text, (@stmtStart/2)+1, 
        ((CASE @stmtEnd
          WHEN -1 THEN DATALENGTH(text)
         ELSE @stmtEnd
         END - @stmtStart)/2) + 1)
    from sys.dm_exec_sql_text(@sqlHandle)
    
	RETURN isnull(@Result,'')

END

 

Parametreler;

  • @sqlHandle : İlgili sql_handle
  • @stmtStart : Statement’ın başlangıç offset’i
  • @stmtStart : Statement’ın bitiş offset’i

Kullanımı;

select master.dbo.GetStatementText( 0x03000500462D95441BA30B01A69D00000100000000000000, 290, 856) as StatementText

 

1

sys.dm_exec_query_stats ile kullanımı;

2

 

İ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 geçenlerde ihtiyacım olan bir konudan, varchar bir değişken içerisinde bulunan bir varbinary(64) değerin varbinary(64)’e convert edilmesi işleminden bahsedeceğim.

[more]

Aslında ne var bunda diyeceksiniz. Altı üstü convert komutuyla convertion’ı yapabildiğimizi düşüneceksiniz. Lakin konu o kadar basit değil. J

Örneklerle ne demek istediğimi anlatmaya çalışayım.

--varbinary(64) değerim string bir değişkenin içinde
declare @str varchar(100)='0x03000500462D95441BA30B01A69D00000100000000000000'
declare @vb varbinary(64)

--ben bu değerin aynı kalarak varbinary(64)'e dönüştürmek istiyorum.
set @vb=convert(varbinary(64),@str)
select @vb
--sonuç
--0x3078303330303035303034363244393534343142413330423031413639443030303030313030303030303030303030303030
--gördüğünüz gibi değer aynı kalmadı,
--varbinary(64)'e çevrildi.Oysa biz ben aynı kalmasını istiyorum.

--O zaman.....
set @vb=convert(varbinary(64),@str,1)
select @vb
--bingooooo :)
--trik nokta convert'in 3.parametresi olan "1".

 

İ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


TÜRKİYE BEYAZAY Derneği İZMİR Şubesi, görme engellilere yönelik, 360 saatlik, milli eğitim onaylı sertifikalı kurs düzenleyecektir.

Kurs, Ocak 2011'de başlayacak, Dört buçuk ay (90 iş günü) sürecektir.

Bu kursa katılan öğrencilere, günlük 15 T.L. cep harçlığı verilecektir.

Bu kursta: Yazılım ve Donanım hakkında temel bilgiler, On parmak klavye kullanımı, İşletim sistemi hakkında temel bilgiler, Word, Excel, Powerpoint, İnternet Explorer, Windows Live Messenger gibi Programlar ve Donanım bilgileri hakkında eğitim verilecektir.

Not: bu iletiyi kişi listelerinize, ulaşabildiğiniz Gazete, Dergi, Form Siteleri, Haber Siteleri, Radyo_Televizyonlara ve minimum gönderebileceğiniz Kitle İletişim araçlarına göndermenizi, önemle rica ederiz.

İletişim bilgileri:
Tel: 0 232 483 10 44
Başkan Salih ARIKAN Cep Tel: 0 506 514 96 93
Mail grubu: beyazaygonulluleri@googlegroups.com
Web sitemiz: www.beyazay.org
Adres: P.K. 35240
Pazaryeri Mah. 943 Sok. No: 65
Basmane, Konak, İZMİR.

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