5 Aralık 2008 Cuma

Rastgele Veri Seçimi (TABLESAMPLE)

Bir tablodan rastgele veri seçmek için FROM' dan sonra TABLESAMPLE komutunun kullanılabileceğini biliyor muydunuz?

Örneğin:
SELECT * FROM Sales.SalesOrderDetail TABLESAMPLE SYSTEM (2 PERCENT)

şeklinde kullanabilirsiniz. Yalnız şunu hemen belirteyim ki bu komut oldukça istikrarsızdır. Yani siz, tablodaki kayıtların %2' sini getirmesini belirtirsiniz, ama dönecek kayıtların sayısı oldukça değişken olacaktır. Bu komutu şu şekilde de kullanabilirsiniz:

SELECT * FROM Sales.SalesOrderDetail TABLESAMPLE SYSTEM (500 rows)

ama kesinlikle net olarak 500 kayıt döndürmeyecek, 800 ile 300 arası kayıt döndürecektir.

Bir başka kullanılışı ise şöyle:

SELECT * FROM Sales.SalesOrderDetail TABLESAMPLE SYSTEM (500 rows) REPEATABLE (123456)


Bu kullanımda REPEATABLE seçeneğinde bir "bigint" değeri belirtip, her seferinde aynı sonucun dönmesini sağlayabilirsiniz, ta ki veri değişmediği sürece.

Eğer bir INSERT, UPDATE, DELETE veya Index Rebuilding gibi işlemler yapılırsa, REPEATABLE' da verdiğiniz değer aynı bile olsa farklı bir set dönecektir.

"Performance counter registry hive consistency"

HATA MESAJI:
"Performance counter registry hive consistency"

AÇIKLAMA:
SQL Server 2008 Setup' ında böyle bir mesaj alabilirsiniz.

ÇÖZÜM:
Bu sorun, bazı Kayıt Defteri (Registry) değerlerinin tutarsızlığından kaynaklanıyor. Sorunun çözümünü aşağıda adresini verdiğim sayfada bulabilirsiniz:

http://www.ferventcoder.com/archive/2008/08/10/possible-performance-counter-corruption-or-performance-counters-are-just-disabled.aspx

"The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current d

HATA MESAJI:
"The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification, please set the compatibility level for current database to 80 or lower, using stored procedure sp_dbcmptlevel. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes."

AÇIKLAMA:
SQL Server 2005 veya daha üst versiyonlarında böyle bir hata mesajı ile karşılaşabilirsiniz.

Aslında hata mesajı, hatanın nedenini ve çözümünü açıklayıcıdır. Fakat İngilizce ile sorunu olan arkadaşlar için yine de bu hatayı belgelemek istedim.

Sorun, "*=" ve "=*" operatörlerinin SQL Server 2005 ve daha üstü versiyonlarda artık desteklenmediğinden kaynaklanmaktadır. Bu desteğin çekileceği uzun zaman boyunca uzmanlar ve Microsoft tarafından belirtilmişti.

ÇÖZÜM:
Şayet SQL Server 2000 ve daha öncesinden gelen View, Stored Procedure veya diğer kodlarınızın içinde bulunan bu JOIN operatörlerini değiştirmediyseniz, aşağıda belirtildiği gibi değişiklik yapmanız sorunu çözecektir.

"*=" JOIN operatörü yerine "LEFT JOIN",
"=*" JOIN operatörü yerine de "RIGHT JOIN" komutlarını kullanabilirsiniz.

Eskisi:
USE AdventureWorks
GO
SELECT * FROM Sales.salesPerson AS salesPerson, Sales.salesTerritory AS salesTerritory
WHERE salesPerson.territoryId *= salesTerritory.territoryId

Yenisi:
SELECT * FROM Sales.salesPerson AS salesPerson
LEFT OUTER JOIN sales.salesTerritory AS salesTerritory
ON salesPerson.territoryId = salesTerritory.territoryId

"Can't find Registry key : SOFTWARE\Microsoft\MSDTC"

HATA MESAJI:
"Can't find Registry key : SOFTWARE\Microsoft\MSDTC"

AÇIKLAMA:
SQL Server 2005 Setup' ında böyle bir hata mesajıyla karşılaşabilirsiniz.

Bir SQL Server 2008 Instance' ı yüklerken bu hata ile karşılaşabilirsiniz. Sorunun nedeni ise, hata mesajında da belirtildiği gibi MSDTC anahtarının Kayıt Defterinde (Registry) bulunmamasıdır.

ÇÖZÜM:
Bu eksikliklerin giderilmesi veya MSDTC' nin yüklenmesi için Komut İstemcisinde aşağdaki komutları sırasıyla ve tek tek çalıştırın.

net stop msdtc
msdtc -uninstall
msdtc -install
net start msdtc

"Increment the Counter Registry Key for Setup in SQL Server 2005"

HATA MESAJI:
"Increment the Counter Registry Key for Setup in SQL Server 2005"

AÇIKLAMA:
SQL Server 2005 Setup' ında böyle bir hata mesajıyla karşılaşabilirsiniz.

ÇÖZÜM:
Bu sorunun çözülmesi için Komut İstemcisinden aşağıdaki komutu çalıştırın.

lodctr /R:PerfStringBackup.INI

"See Object Explorer Details for objects in this folder"

BİLGİ:
"See Object Explorer Details for objects in this folder"

AÇIKLAMA:
SQL Server 2008' in SQL Server Management Studio aracını kullanarak, Object Explorer' daki 2500' den fazla öğe içeren herhangi bir düğümü\klasörü genişlettiğinizde bu mesaj ile karşılaşabilirsiniz.

Aslında bu bir hata değil, tasarımdan kaynaklanan bir sınırlama. Bu sınırlamanın nedeni ise Windows XP ve Windows Server 2003' teki Tree View kontrolündeki bir hata (BUG).

Bu sınırlamayı kaldıran herhangi bir yama veya çözüm şu anda yok.

Bununla birlikte, alternatif olarak (ilgili mesajda da belirtildiği üzere) Object Explorer yerine Object Explorer Details penceresini kullanabilirsiniz veya ilgilendiğiniz öğelerin listelenmesi için süzgeci kullanabilirsiniz.

Süzgeci kullanabilmek için, genişlettiğiniz düğümün üzerinde (misal olarak eğer tabloları genişletmek istiyorsanız bu düğümün adı "Tables" olacaktır) farenin sağ tuşuna tıklayın ve açılan menüden "Filter -> Filter Settins" öğesini seçin. Açılan süzgeç ayarları penceresinde ilgili süzme ayarlarını yapıp (2500 öğeyi geçmeyecek kadar) sadece ilgilendiğiniz öğeleri listeleyebilirsiniz.

Konuyla ilgili geribildirimi ve bu geribildirime Microsoft' tan gelen cevabı okumak için şu bağlantıyı takip edin:
https://connect.microsoft.com/SQLServer/feedback/Viewfeedback.aspx?FeedbackID=362453

5 Kasım 2008 Çarşamba

SQL Server 2008: Auditing

Merhaba arkadaşlar,

Bu özellik, kısmen de olsa SQL Server 2005' te SQL Trace gerçekleştirilebiliyordu. Kısmen diyorum, çünkü "hangi veritabanına kimler erişmiş?" gibi denetimleri SQL Trace ile yapamıyorduk. Bu tür denetimleri gerçekleştirmek için üçüncü parti programlar kullanılıyor veya alternatif yöntemlerle gerçekleştirilmeye çalışılıyordu. Fakat artık, bu tür denetimler de SQL Server 2008 ile gerek veritabanı, gerekse sunucu düzeylerinde yapabiliyor.

Denetim derken...?
Denetimden kasıt, "Veritabanımdaki bir tabloya\tablolara kim erişmiş?", "Kim yeni kayıt eklemiş veya silmiş veya değişiklik yapmış?", "Kim yeni bir Login oluşturmuş?" gibi sorulara ayrıntılı olarak cevap bulmanızdır. Sunucu veya veritabanı düzeyinde, çeşitli denetimleri SQL Server 2008' in bu özelliği ile takip edebilirsiniz. İleriki bölümlerde ayrıntılı örneklerini de göstereceğim.

Nasıl yapılır?
Önceki paragraflarda da belirttiğim gibi, denetim işlemi hem sunucu düzeyinde, hem de veritabanı düzeyinde gerçekleştirilebilir.

Bir denetim işlemini başlatmadan önce, bu denetim kayıtlarının nerede, nasıl ve hangi ayarlara göre saklanması gerektiğini ayarlamanız gerekiyor. Bunun için, ilk önce sunucu düzeyinde bir Audit oluşturmalısınız. Ardından, eğer denetimi sunucu düzeyinde yapmak istiyorsanız bir Server Audit Specification, eğer denetimi veritabanı düzeyinde oluşturmak istiyorsanız o zaman da bir Database Audit Specification oluşturmalısınız.

Bu elemanları ister T-SQL kullanarak, isterseniz de SQL Server 2008 ile birlikte gelen SQL Server Management Studio ile oluşturabilirsiniz. Örneklerimizde ben iki yöntemi de kullanacağım. Böylece iki yöntem hakkında da fikriniz olacak.

Şimdi, aşağıda da listelediğim bu üç denetim elemanını nasıl oluşturacağınızı, bunların ne olduğunu ve bu denetim sonucu oluşan raporu nasıl okuyacağınızı adım adım kendi başlıkları altında inceleyelim.

Audit : Denetim verilerinin saklanacağı konum ayarları.
Server Audit Specification: Sunucu düzeyinde belirlenecek denetim kuralları.
Database Audit Specification: Veritabanı düzeyinde belirlenecek denetim kuralları.
Log Viewer - Audit: Audit nesnesinde tanımladığımız raporun okunması.
Yapacağımız örneklerde bir senaryo üzerinden gidersek, konunun ve bu denetim mekanizmasına aşina olmayanların konuyu anlamasına yardımcı olacağını düşünüyorum. Senaryomuz şöyle: Şirketimizde, bilişim işleriyle ilgili taşeron bir firma var. Bu firmadan çalışanlar zaman zaman şirketimize geliyorlar ve SQL Server sunucumuzda bazı çalışmalar yapıyorlar. Ayrıca, bu arkadaşların SQL Server Instance' ımıza da erişim hakları var. SQL Server Instance' ımızdaki veriler bizim için çok kritik ve önemli. Taşeron firmadan gelen arkadaşların yetkileri yüksek, bu nedenle görmelerini istemediğimiz verilere erişme şansları var. Yaptığımız yazılı anlaşmalar neticesinde, böyle bir şeyin olmayacağını garanti ediyorlar. Ama herkesin malûmu, sonuçta ortada bir insan faktörü var ve biz veritabanı yöneticileri, güvenliği sıkı tutmalıyız. Aksi takdirde hesap sorulacakların en üst sıralarında bizim de isimlerimizin olduğunu çok iyi biliyoruz.

Özetle, şirketimize gelen taşeron firma çalışanlarının, "Muhasebe" isimli veritabanındaki tablolarımıza erişim erişmediklerini sıkı bir şekilde kontrol edeceğiz.

Audit
Audit' in nasıl oluşturulduğuna geçmeden önce, Audit' in üç farklı yere kaydedilebileceğini belirtmek istiyorum. Bunlar:

Windows Event Log: Application Log' a
Windows Event Log: Security Log' a
Dosya sisteminde bir dosyaya.
Not: Security Log' a kayıt işlemi Windows XP' de gerçekleştirilemiyor. Ayrıca, Security Log' a kayıt yaptırmak için ekstra ayarlar yapmanız gerekiyor. Bu ekstra ayarlar konusunda daha fazla bilgi için buraya tıklayın.

Biz örneğimizde, denetim verilerimizi bir dosyaya kaydedeceğiz.

T-SQL Yöntemiyle Audit Oluşturmak:

CREATE SERVER AUDIT [AuditTaseron] TO FILE
(FILEPATH = N'C:\Test\' ,
MAXSIZE = 500 MB ,
MAX_ROLLOVER_FILES = 5,
RESERVE_DISK_SPACE = OFF )
WITH
(QUEUE_DELAY = 1000 ,
ON_FAILURE = SHUTDOWN )
GO

Bir Audit nesnesi oluşturulduğunda, varsayılan olarak kullanılamaz (disabled) şekilde oluşturulur. (bkz. Resim - 3)

Dikkatinizi çektiyse, FILEPATH ile bir dosya adı değil, klasör yolu belirttim. Çünkü dosya adını, SQL Server kendi atayacak. MAXSIZE ise, denetim dosyasının ulaşabileceği en büyük dosya boyutu olacak. Bu ayarı yapmakta fayda var, çünkü zaten sunucunuzda bir çok kayıt dosyası sürekli doluyor ve büyüyor. Bu tür büyümeleri kontrol altında tutarsanız, bir gün "Diskinizde boş yer kalmadı!" gibi bir sürpriz ile karşılaşma olasılığınız azalır. MAX_ROLLOVER_FILES, kaç tane dosyanın kaydedileceği bilgisidir. 0 değeri sınırsız anlamına gelir. RESERVE_DISK_SPACE, MAXSIZE' da belirttiğiniz kadar alanı baştan ayırmak için kullanılır; eğer değeri ON ise, o zaman bu alan baştan ayrılır, eğer OFF ise, alan ihtiyaca göre ayrılır.

Audit işlemi, Service Broker temel alınarak yapılan bir işlemdir. İşlemler istenirse eşzamanlı (synchronous), istenirse de eşzamansız (asynchronous) olarak gerçekleştirilebilir. İşte bu ayar da QUEUE_DELAY ile belirtilir. Eğer bu ayarın değeri 0 ise, denetim sırasında toplanan veriler, kayıt yerine (Event Log' lara veya dosyaya) eşzamanlı olarak kaydedilir. Eğer bu değer 1000 ise (ki bu değerler milisaniye bazındadır ve asgari değer 1000' dir) o zaman biriktirilen denetim verileri, kayıt deposuna her bir saniyede bir yazılır. Burada dikkate alınması gereken şey ise, eşzamanlı veya çok kısa aralıklı yapılacak kayıt işlemlerinin belli bir oranda yük getirmesi olacaktır. Sisteminizin durumuna göre bu kayıt aralığını hesaplamalısınız. Ayrıca şunu da unutmamalısınız ki, eğer bu kayıt aralığını fazla uzun tutarsanız, kayıt deposuna kaydedilmemiş denetim verilerini bir elektrik kesintisi veya bir donanım arızası yüzünden kaybetme olasılığınız vardır.

ON_FAILURE ise iki değer alabilir, SHUTDOWN veya CONTINUE. Eğer kayıt dosyasında yer kalmadıysa veya diskinizde yer kalmadıysa yani özetle eğer denetim verileriniz kayıt deposuna kaydedilemiyorsa ve bu ayarın değeri de SHUTDOWN ise, o zaman SQL Server Instance' ınız böyle bir durumda kapanacaktır.

SQL Server Management Studio (SSMS) Kullanarak Audit Oluşturmak:

Denetimler, güvenlikle ilgili ve sunucu düzeyinde çalışan nesnelerdir. Bu nedenle yeni bir Audit oluşturmak istediğinizde, SSMS' teki Object Explorer penceresinden, Security->Audits bölümüne gidersiniz. (bkz Resim 1)

Resim - 1

Resim-1 de de görüldüğü gibi, Audits düğümünün üzerinde fare ile sağ tuşa tıkladığınızda "New Audit..." öğesini göreceksiniz. Bu öğeye tıklayın, "Create Audit" penceresi açılacaktır.

Resim - 2

Yine bu başlık altında, T-SQL kullanarak oluşturduğumuz Audit in aynısı, fakat bu sefer bu Audit' i SSMS kullanarak oluşturuyoruz. Resim - 2' de gördüğünüz tüm ayarları zaten yukarıda açıklamıştım, bu nedenle tekrar açıklamaya gerek yok. Biraz gözatarsanız zaten her şeyin aynı olduğunu göreceksiniz.

Daha önceden size yeni bir Audit nesnesi oluşturduğunuzda, bu nesnenin varsayılan olarak kullanılamaz şekilde oluşturulduğunu söylemiştim. Şimdi bunu tekrar belirtmemin nedeni ise, SSMS' te bu kullanılamazlığın görsel olarak da belirtilmesidir. Bunun için Resim -3' e bakın. Daha belirgin olması için kırmızı bir halka içine aldım.

Resim - 3

Bu nesneyi kullanılabilir hale getirmek için, üzerinde farenin sağ tuşuna tıklamanız ve "Enable Audit" öğesini seçmeniz gerekiyor. Bu noktada şunu da belirtmek istiyorum ki, daha sonraki başlıklarda oluşturacağımız Server Audit Specification ve Database Audit Specification nesneleri de varsayılan olarak kullanılamaz şekilde oluşturulur ve bu nesneler kullanılamaz durumdayken bu durum, Object Explorer' da aynen Resim - 3' teki gibi aşağı kırmızı bir ok ile görsel olarak belirtilir ve bu nesneleri kullanılabilir duruma getirmek için yine aynı şekilde bu nesnelerin üzerinde fare ile sağ tıklayıp "Enable ..." öğesini seçmeniz gerekir.

Bu noktada, artık Audit oluşturma konusunda bir sıkıntı kalmadığını varsayıyorum. Hadi, şimdi de Server Audit Specification nasıl oluşturulur onu inceleyelim!

Server Audit Specification
Bir Server Audit Specification nesnesi oluşturmadan önce, bu nesneyi oluştururken kullanmak üzere bir Audit nesnesinin önceki başlıkta da anlatıldığı gibi oluşturulması gerekiyor.

Bir Server Audit Specification nesnesi oluşturulduğunda, varsayılan olarak kullanılamaz (disabled) şekilde oluşturulur.

T-SQL Yöntemiyle Server Audit Specification Nesnesi Oluşturma

Bu örneğimizdeki Server Audit Specification nesnesine , 4 tane Action Type ekleyeceğim.

CREATE SERVER AUDIT SPECIFICATION [sasTaseron]
FOR SERVER AUDIT [AuditTaseron]
ADD (LOGIN_CHANGE_PASSWORD_GROUP),
ADD (SERVER_ROLE_MEMBER_CHANGE_GROUP),
ADD (SERVER_PRINCIPAL_CHANGE_GROUP),
ADD (DATABASE_CHANGE_GROUP)
GO

Bir Server Audit Specification nesnesini oluşturmak için öncelikle bir Audit nesnesine ihtiyacımız olduğunu önceden de söylemiştim. İşte bu örneğimizde de önceki Audit altbaşlığında oluşturmuş olduğumuz "AuditTaseron" nesnesini kullanıyoruz. Daha sonra da, aşağıda listelediğim Action Type' ları ekliyoruz:

LOGIN_CHANGE_PASSWORD_GROUP: Bu olay, sp_password veya ALTER LOGIN komutlarıyla bir Login' in şifresi değiştirildiğinde tetiklenir.
SERVER_ROLE_MEMBER_CHANGE_GROUP: Bu olay, bir Login, bir Server Fixed Role' e eklenip veya çıkarıldığında tetiklenir.
SERVER_PRINCIPAL_CHANGE_GROUP: Bu olay, örneğin bir Login' in silinmesi veya yeni bir Login' in eklenmesi veya bir Login üzerinde bir takım değişiklikler (örneğin Login' in varsayılan dilini değiştirdiğinizde) yaptığınızda tetiklenir.
DATABASE_CHANGE_GROUP: Bu olay, bir veritabanı silindiğinde, yeni bir veritabanı oluşturulduğunda veya varolan bir veritabanında değişiklik yapıldığında tetiklenir.
Biz örneğimizde sadece 4 tane Action Type kullandık, fakat bu Action Type' lardan başka daha bir çok Action Type vardır. Diğer Action Type' lar hakkında daha fazla bilgi almak için Books Online' a bakabilirsiniz: http://msdn.microsoft.com/en-us/library/cc280663.aspx

SQL Server Management Studio (SSMS) Kullanarak Server Audit Specification Oluşturmak:

Server Audit Specification nesnesi de Audit nesnesi gibi güvenlikle alâkalı bir nesne olduğu için, SSMS' teki Object Explorer' ın, Security düğümünün altında bulunur. (bkz Resim - 4)

Resim - 4

"New Server Audit Specification..." öğesine tıkladığınızda "Create Server Audit Specification" penceresi açılacaktır. (bkz Resim - 5)

Resim - 5

Bu pencerede temel olarak yapacağınız işlem, bu Server Audit Specification nesnesine bir isim vermek, önceden oluşturduğunuz Audit nesnesini, Audit aşağı açılır kutusundan belirlemek ve Audit Action Type listesindeki aşağı açılır kutulardan, ihtiyacınıza göre Action Type' lar eklemektir.

Aynı örneği yukarıda T-SQL ile yaparken size bir çok Action Type olduğunu söylemiştim. Bu Action Type' ların listesini de bu şekilde görmüş oldunuz. Bunların açıklamaları için yine yukarıda verdiğim Books Online adresinden yararlanabilirsiniz. Books Online' nın maalesef bir Türkçe versiyonunun olmadığını da bilmeyenler ve merak edenler için belirteyim.

Audit ve Server Audit Specifications açıklamalı ve adım adım uygulamış olduğumuz örneklerden sonra sıra şimdi de Database Audit Specifications konusunda!

Database Audit Specifications
Yine belirtmem gerekiyor ki, bir Database Audit Specification nesnesi oluşturmadan önce, bu nesneyi oluştururken kullanmak üzere bir Audit nesnesinin Audit başlığında da anlatıldığı gibi oluşturulması gerekiyor.

Ve yine belirtmekte fayda var ki, bir Database Audit Specification nesnesi oluşturulduğunda, varsayılan olarak kullanılamaz (disabled) şekilde oluşturulur.

Bu örnekte, öncelikle hayali taşeron firma için bir Login, "Test" isimli veritabanımızda, oluşturacağımız "TestLogin" isimli Login için "TestUser" isimli bir de User oluşturacağız. Daha sonra, hayali "Alacaklar" isimli tablomuzda, bu "TestUser" kullanıcısı tarafından bir SELECT, UPDATE, INSERT veya DELETE komutunun çalıştırılmasığını kontrol etmek için bir Database Audit Specification nesnesi oluşturacağız. Diğer örneklerimizde olduğu gibi, bu örneği de hem T-SQL ile, hem de SSMS kullanarak yapacağız.

T-SQL Yöntemiyle Database Audit Specification Nesnesi Oluşturma

Aşağıdaki T-SQL kodlarını çalıştırmadan önce, önceden oluşturmuş olduğumuz "AuditTaseron" isimli Audit nesnesini ve "sasTaseron" isimli Server Audit Specification nesnesini kullanılır (Enable) duruma getirdiğinizden emin olun. Nedenini daha sonra söyleyeceğim.

-- "TestLogin" isimli Login' in oluşturulması
USE [master]
GO
CREATE LOGIN TestLogin WITH PASSWORD = 'Pa$$w0rd'
GO

-- Test için kullanılacak, "Test" isimli veritabanının oluşturulması
USE [master]
GO
CREATE DATABASE [Test]
GO

-- Test için kullanılacak "Alacaklar" isimli veritabanının oluşturulması
USE [Test]
GO
CREATE TABLE [Alacaklar]
(id int)
GO

/* "Test" isimli veritabanında işlem yapabilmesi için, taşeron firma çalışanı tarafından kullanılacak "TestUser isimli kullanıcının oluşturulması */
USE [Test]
GO
CREATE USER [TestUser] FOR LOGIN [TestLogin]
WITH DEFAULT_SCHEMA=[dbo]
GO

-- "TestUser" isimli kullanıcının "db_owner" veritabanı rolüne eklenmesi
USE [test]
GO
EXEC sp_addrolemember N'db_owner', N'TestUser'
GO

/* "TestUser" isimli taşeron firma çalışanının "Alacaklar" tabloasuna karşı yapacağı erişimleri takip etmek için kullanılacak "dasAuditTaseron" isimli Database Audit Specification nesnesinin oluşturulması */
USE [Test]
GO
CREATE DATABASE AUDIT SPECIFICATION [dasAuditTaseron]
FOR SERVER AUDIT [AuditTaseron]
ADD (SELECT ON OBJECT::[dbo].[Alacaklar] BY [TestUser]),
ADD (DELETE ON OBJECT::[dbo].[Alacaklar] BY [TestUser]),
ADD (INSERT ON OBJECT::[dbo].[Alacaklar] BY [TestUser]),
ADD (UPDATE ON OBJECT::[dbo].[Alacaklar] BY [TestUser])
GO

Hemen bir önceki paragrafta örneğimizi anlattığım gibi, yukarıdaki T-SQL diliyle de bu örneği SQL Server' a anlatmış oldum.

Server Audit Specification' da olduğu gibi, Database Audit Specification' da da, bir çok Action Type bulunmaktadır. Bu Action Type' ların listesini bir sonraki SSMS örneğimizdeki "Create Database Audit Specification" isimli penceredeki Action Type aşağı açılır kutularında zaten göreceksiniz. Bu Action Type' ların açıklamaları için yine Books Online' dan yararlanabilirsiniz: http://msdn.microsoft.com/en-us/library/cc280663.aspx

SQL Server Management Studio (SSMS) Kullanarak Database Audit Specification Oluşturmak:

Evet! Tahmin edeceğiniz üzere yine aynı şeyi söyleyeceğim! Database Audit Specification nesnesi de elbette güvenlikle alâka bir nesne. Bu nedenle bu nesneler, SSMS' teki Object Explorer' ın Databases isimli düğümünün altındaki veritabanınızın içinde bulunan Security düğümündeki Database Audit Specifications içinde depolanıyor.

Kabul ediyorum, bu terimlere aşina olmayanlara biraz arapsaçı gibi görünmüş olabilir. Ama beni önceden takip edenler bilir, hem de buraya kadar sabredip okumuşsanız siz de görebilirsiniz ki, hiç üşenmeden resimlerle de örnek vermeyi çok severim ben. Hemen aşağıdaki resimde (Resim - 6) Database Audit Specification düğümünü görebilirsiniz.

Resim - 6

"New Database Audit Specification..." öğesine tıkladığınızda "Create Database Audit Specification" penceresi açılacaktır. (bkz Resim - 7)

Resim - 7

Eğer dikkatli bakarsanız, bu arayüzün de, "Create Server Audit Specification" penceresinin arayüzüyle aynı olduğunu görürsünüz ve eğer o penceredeki Object Class, Object, Object Name, Principal alanlarındaki kutucukları kurcaladıysanız, herhangi bir değişiklik yapamadığınızı görmüşsünüzdür. Tek arayüzde iki iş yaptırmaya çalışınca, böyle sonuçlar çıkabiliyor elbette. Neyse ki, bu alanları "Create Database Audit Specification" penceresinde kullanabiliyoruz.

Bildiğiniz üzere Audit Action Type alanında, ihtiyacınıza uygun Action Type' ı seçiyorsunuz. Object Class alanında, seçebileceğiniz üç tane seçenek var. Bunlar: Database, Object ve Schema. (Bu kavramların anlamları ise başka bir konu olduğu ve konumuzun kapsamında olmadığı için bunlara değinmiyorum.) Üzerinde denetim yapmak istediğiniz nesneye göre, Object Class' ını seçersiniz. Meselâ biz örneğimizde "Alacaklar" isimli tabloyu denetlemek istediğimiz için, Object Class olarak "Object" i seçtik. Eğer "Test" isimli veritabanımızdaki tüm tabloları denetlemek isteseydik, o zaman Object Class' ı "Database" olarak seçerdik, Object Name olarak da "Test" i seçerdik. Eğer belli bir kullanıcı veya rolü değil de, tüm kullanıcı ve rolleri denetlemek isteseydik, o zaman Principal alanında bir şey seçmezdik.

Audit, Server Audit Specification ve Database Audit Specification nesneleri için geçerli olan şu kuralı da unutmamalısınız, bu nesnelerden birinde bir değişiklik yapmadan önce, o nesneyi kullanılamaz (disable) duruma getirmeniz gerekir. Aksi takdirde şu hata ile karşılaşırsınız: "Changes to an audit specification must be done while the audit specification is disabled. (Microsoft SQL Server, Error: 33229)".

Log Viewer - Audit
Önceki konu başlıklarında bir Audit' in nasıl oluşturulacağını, bu Audit' in oluşturulmasının sebebi olan bir Server Audit Specification veya Database Audit Specification nesnesinin nasıl ve ne gibi amaçlar için oluşturulabileceğini anlattım. Şimdi sıra, yaptığımız bu otomatik denetim mekanizmasının ürettiği raporların nasıl okunabileceğine geldi.

Bir Audit dosyasının ürettiği kayıt dosyasını okuyabilmek için kullanabileceğiniz en pratik ve kısa yol, SSMS' teki Log Viewer' ı kullanmaktır. Bunun için, SSMS' i açtıktan sonra Resim - 1' de gösterilen Audits düğümü altında oluşturduğunuz Audit nesnesinin üzerinde farenin sağ tuşuna tıklayıp "View Audit Logs" öğesine tıklayın. Bu sayede, Log Viewer açılır ve ilgili Audit nesnenizin ürettiği kayıtları görebilirsiniz. Yukarıda yaptığımız örneklerde hatırlarsanız "TestLogin" adında bir Login oluşturmadan önce size "AuditTaseron" isimli Audit nesnesini ve "sasTaseron" isimli Server Audit Specification nesnesini kullanılabilir duruma getirin demiştim, bunun nedenini de daha sonra söyleyeceğim demiştim. İşte şimdi söylüyorum; bunun nedeni, CREATE LOGIN komutuyla birlikte sunucu düzeyinde bir işlem yapmamızdı. "Eee?" mi diyorsunuz? O zaman şunu da hatırlatayım, "sasTaseron" ismiyle oluşturduğumuz Server Audit Specification nesnesinin içine bir de SERVER_PRINCIPAL_CHANGE_GROUP Action Type' ı eklemiştik. Bu Action Type' ın takip ettiği olaylardan biri de neydi? Login oluşturulması! Yani eğer CREATE LOGIN komutuyla "TestLogin" Login' ini oluşturmadan önce "AuditTaseron" ve "sasTaseron" isimli nesneleri kullanılabilir duruma getirdiyseniz, "TestLogin" ismindeki Login' i oluşturduğunuz denetim kayıtlarına geçmiş demektir. Sizi bilmiyorum, ama ben nizami şekilde kendi dediklerimi uyguladım ve sonucunu görmek için Resim - 8' e bakabilirsiniz.

Resim - 8

Aslında kaydırma çubuğundan da anlaşılabileceği üzere, oldukça çok alan var ve bu kadar alanı bu kadar küçük bir resme sığdırmak imkânsız. Sığdırsam bile herhalde mikroskopla incelemeniz gerekirdi. Ama yine de bu resimde, elimden geldiğince çok veriyi size göstermeye çalıştım. Alanlardan anlatmaya başlarsak, örneğin, bu komutun çalıştırıldığı tarih ve saati görebilirsiniz. Hangi SQL Server Instance' ında gerçekleştiği (EKREM-PC), hangi komutun çalıştırıldığı (CREATE) ve bu komut ile hangi sınıf işlem yapıldığı (SQL LOGIN) ve daha bir çok bilgiyi görebilirsiniz. Aşağıdaki ayrıntılı bilgi alanına bakarsak, ilk göze çarpacak bilgilerden birisi, "CREATE LOGIN TestLogin WITH PASSWORD '*****'" tür sanırım. Hangi nesnenin hangi komutla oluşturulduğu bilgisi oldukça değerli olabilir. Ayrıca bu nesneyi hangi Login' in oluşturduğunu da görebilirsiniz (EKREM-PC\ekrem).

Bununla birlikte, yine Resim - 8' deki "File Name" bilgisi dikkatinizi çekti mi? Hatırlarsanız, "AuditTaseron" isimli Audit nesnesini oluştururken dosya adı değil, sadece dosya yolu belirtilir demiştim. Dosya adını ise, SQL Server, Audit nesnesinin adı olarak belirlediğiniz bir ad ile birlikte bir GUID (Globally Unique Identifier)' i birleştirerek ve uzantısını da ".sqlaudit" yaparak verir. Bu resimde, bir çok bilgiyle birlikte bu dosya adını da görebiliyorsunuz.

Ayrıca, test etmek için şimdi gidip, "dasTaseron" ismiyle oluşturduğumuz Database Audit Specification nesnesini de kullanılılabilir duruma getirebilirsiniz. Bu nesneye ait kayıtlara da, "sasTaseron" isimli Server Audit Specification nesnesinde olduğu gibi, o nesnenin bağlı olduğu Audit nesnesinin üzerinde farenin sağ tuşuna tıklayarak ve "View Audit Logs" öğesini seçerek ulaşabilirsiniz. "TestUser" isimli kullanıcının "Alacaklar" isimli tabloya yapacağı SELECT, UPDATE, DELETE ve INSERT (DML - Data Manipulation Language) işlemleri yine bu kayıt dosyasında, aynen CREATE LOGIN işlemindeki gibi kaydedilecektir. Fakat "dasTaseron" nesnesini test etmek için sunucuya "TestLogin" ile giriş yapmalı ve bu Login' in "Test" isimli tablodaki bağlı olduğu kullanıcı olan "TestUser" kullanıcısıyla "Alacaklar" tablosuna karşı bir DML işlemi yapmanız gerekiyor. Çünkü hatırlarsanız, Database Audit Specification nesnemizi bu kriterlere göre oluşturmuştuk. Eğer dediğim gibi "TestLogin" kullanıcısıyla bağlanıp "Alacaklar" tablosuna bir sorgu çekerseniz, göreceksiniz ki "AuditTaseron" isimli Audit kayıt dosyasınaki CREATE LOGIN komutunun üzerine bu yaptığınız işlemle ilgili başka bir kayıt daha eklenecektir.

Özet
Çok beklenen ve SQL Server 2008 ile birlikte gelen bir çok özellikten biri olan Auditing konusunu size anlatmaya çalıştım. Bu makaleye başlarken de dediğim gibi, bu gereksinim gerek bazı üçüncü parti yazılımlarla, gerekse SQL Trace ile giderilmeye çalışılıyordu. Fakat artık SQL Server 2008 ile birlikte, arayüz desteğiyle de (SQL Trace özelliği için arayüz desteği yoktu) bu iş oldukça kolaylaştırıldı.

Biz veritabanı yöneticilerinin ana sorumluluklarının başında güvenlik geliyor. "Kim, hangi bilgiye ne zaman erişmiş?" veya "Bu tablodaki değişikliği kim yapmış?" gibi sorulara her an yanıt verebilmeliyiz. Bu yeni Auditing özelliği sayesinde, bu konudaki işimiz daha kolaylaşacak. Umarım bir gün sizin de işinize yarar.

Ekrem Önsoy

"Failed to install and configure assemblies C:\Program Files\Microsoft SQL Server\90\DTS\Tasks\Microsoft.SqlServer.MSMQTask.dll in the COM+ catalog. E

HATA MESAJI:
"Failed to install and configure assemblies C:\Program Files\Microsoft SQL Server\90\DTS\Tasks\Microsoft.SqlServer.MSMQTask.dll in the COM+ catalog. Error: -2146233087 Error message: Unknown error 0x80131501 Error description: One or more of the components being installed are already registered in the target application. You must install the 64 bit versions of the components being installed in a different COM+ application, or delete the existing 32 bit versions of the components being installed from the target COM+ application prior to attempting install of the 64 bit versions. COM+ applications cannot contain bit neutral components."

AÇIKLAMA:
64 Bit bir Windows işletim sistemi üzerinde SQL Server 2005' i kurarken kurulum esnasında böyle bir hata mesajıyla kurulum duraklatılabilir.

Bu hatayı almanızın nedeni ise, sisteminizdeki MSMQTask COM+ bileşeninin önceden 32 bit olarak kurulu bulunmasıdır.

ÇÖZÜM:
Ben bu sorunla karşılaştığımda, sorunu çözmek için Component Services MMC' sindeki MSMQTask COM+ bileşenini kaldırdım ve SQL Server Setup' ın verdiği hata mesajı penceresindeki "Retry" düğmesine tıkladım ve kurulum sorunsuz şekilde devam edip başarıyla tamamlandı.

MSMQTask COM+ Bileşeni Nasıl Silinir?
- Start\Programs\Administrative Tools\Components Services' i açın,
- "Component Services" -> "My Computer" -> "COM+ Applications" düğümlerini genişletin,
- "Microsoft.SqlServer.MSMQTask" bileşenini göreceksiniz. Bu bileşen üzerinde farenin sağ tuşuna tıklayıp "Delete" öğesini seçerek bu bileşeni silin.
- SQL Server Setup' a geri dönün ve hata mesajı penceresindeki "Retry" düğmesine tıklayın.

"ASP.Net Version Registration Requirement (Warning)"

HATA MESAJI:
"ASP.Net Version Registration Requirement (Warning)"

AÇIKLAMA:
64 Bit bir Windows işletim sistemi üzerinde SQL Server 2005' i kurarken, "System Configuration Check" penceresinde böyle bir uyarı mesajıyla karşılaşabilirsiniz.

Bu hatayı almanızın nedeni ise, 64Bit sisteminizde 32Bit uygulamaların çalıştırılmasının varsayılan olarak etkinleştirilmemesidir.

ÇÖZÜM:
Aşağıdaki kodu çalıştırdığınızda, bu hata mesajını bir daha SQL Server Setup' ını çalıştırdığınızda almayacaksınız.

cscript %SystemDrive%\inetpub\AdminScripts\adsutil.vbs set w3svc/AppPools/Enable32bitAppOnWin64 1

SQL Server 2008: Integrated Full-Text Index Catalog

SQL Server' ın önceki versiyonlarında Full-Text Catalog, IN PATH seçeneği kullanılarak ayrı bir klasörde tutulabiliyordu. SQL Server 2008' de ise Catalog ayrı bir klasörde tutulamıyor. Bunun yerine bir FileGroup' ta, veritabanının bir parçası olarak saklanıyor.

"IN PATH" seçeneği SQL Server 2008' de geriye dönük destek için hâlâ kullanılabiliyor, fakat yeni uygulamalarınızda bu seçeneği kullanmamanızı tavsiye ediyorum. Çünkü SQL Server 2008' den itibaren bu seçenek "ileriki versiyonlarda kaldırılacak özellikler" listesine girdi (Yani "Depricated" oldu).

Ayrıca, eğer mümkünse Full-Text Catalog için ayrı bir FileGroup oluşturun.

SQL Server 2008: Resource Veritabanı

SQL Server 2005' te, "master" sistem veritabanını varsayılan yerinden başka bir yere taşımanız gerektiğinde "resource" sistem veritabanını da "master" veritabanını taşıyacağınız yere taşımalıydınız.

SQL Server 2008' de bu zorunluluk kaldırıldı. Artık ikisini de farklı yerlerde tutabilirsiniz. SQL Server 2008' de, "resource" veritabanının varsayılan yeri şöyle:

"-sürücü-:\Program Files\Microsoft SQL Server\MSSQL-instance_no-.-instance_adı-\Binn\".

Microsoft, bu veritabanının yerinin değiştirilmemesini iki nedenle öneriyor, bunlar: 1-SQL Server servis paketleri veya "hotfix" ler bu veritabanını \Binn klasöründe oluşturuyor.
2-Failover Cluster' lı bir SQL Server ortamında "resource" veritabanınının yerinin Cluster olmayan bir yerle değiştirilmesi, Failover Cluster çalışmamasına neden olacaktır.

SQL Server 2008: Replace Fonksiyonu

SQL Server 2005' te, Replace fonksiyonunu kullandığınızda, bu fonksiyonun aldığı üç parametrenin sağındaki boşluklar otomatik olarak siliniyordu (RTRIM). Fakat SQL Server 2008' deki Replace fonksiyonunda bu boşluklar otomatik olarak silinmiyor. Bu işlemin aynen SQL Server 2005' teki gibi olmasını isteyenler Replace fonksiyonunu şu şekilde kullanabilirler:

REPLACE(RTRIM(parametre1), RTRIM(parametre2), RTRIM(parametre3)).

SQL Server' da noktalı virgül kullanımı

SQL Server' ın sıradaki değil (yani muhtemelen 2011' de çıkacak versiyon değil), ama ondan sonraki SQL Server versiyonunda (muhtemelen SQL Server 2014) T-SQL komutlarının sonuna noktalı virgül koyulması zorunlu olacak.

Bunu şimdiden sizinle paylaşıyorum ki, ileriye dönük projeleriniz için noktalı virgül kullanımına şimdiden başlayın. Aksi takdirde, gelecekteki SQL Server' da uygulamanızı çalıştırırken sorun yaşarsınız. Muhtemelen "daha çook var" diyorsunuzdur, zaten benim de "ileriye dönük" ibaresini vurgulamamın nedeni buydu.

SQL Command (SQLCMD)

SQLCMD aracı vasıtasıyla çalıştırdığınız Script' lerde veya komut satırlarında değişkenler kullanabileceğinizi biliyor muydunuz?

Örneğin, "yedek_al.sql" isimli Script' inizin içinde şöyle bir yedek alma komutu olsun:

"BACKUP DATABASE $(Veritabanim) TO DISK=N'D:\SQLYedekler\$(Veritabanim).bak'"

Gördüğünüz gibi, buradaki değişken adı "Veritabanim". Bu değişkene atanacak değer ise, SQLCMD komutuyla "yedek_al.sql" Script dosyası çağırılırken "-v" parametresi ile atanıyor.

Örnek: SQLCMD -E -i yedek_al.sql -v Veritabanim="Muhasebe".

SQL Command (SQLCMD)

ISQL ve OSQL, SQL Server 2005' ten önce SQL Server Instance' larında Komut İstemcisinden işlem yapmak için kullanılan Komut İstemcisi araçlarıydı. SQL Server 2005 ile birlikte, tamamen yeniden yazılan SQL Command (SQLCMD) Komut İstemci aracı geliştirildi ve OSQL da tedavülden kalkma sürecine girdi ("Deprecated" oldu).

SQLCMD' den önceki araçlar SQL Server Instance' larına ODBC ile bağlanıyorlar ve bu yüzden bir seferde bir Instance' a bağlanabiliyorlardı. Fakat SQLCMD aracı bağlantı için OLE DB kullanıyor ve bu sayede değişik SQL Server Instance' larına bir Script' te birden fazla bağlantı kurabiliyor.

Örnek vermek gerekirse, ODBC ile bağlandığınızda bir Script içerisinde iki farklı SQL Server Instance' ından iki farklı veritabanının yedeğini alamazsınız. Fakat aynı işlem için SQLCMD kullanarak ve Script' inizde de

":CONNECT SQLServerInstanceAdı -E"

komutunu da kullanarak farklı Instance' larda işlem yapabilirsiniz.

SQL Server Agent

SQL Server 2005 ve 2008' de, bir kullanıcıyı "sysadmin" yapmadan, bu kullanıcıya iş (Job) oluşturma ve bunu yönetme hakkı verebileceğinizi biliyor muydunuz?

Bunun için, bahsi geçen kullanıcıyı MSDB veritabanındaki üç rolden birine atamanız yeterli.

Rolleri, yetkileri en kısıtlı olandan itibaren yazıyorum:
1) SQLAgentUserRole,
2) SQLAgent ReaderRole,
3) SQLAgentOperatorRole.

Roller hakkında daha fazla bilgi için Books Online' a bakabilirsiniz: http://msdn.microsoft.com/en-us/library/ms188283.aspx

3 Ekim 2008 Cuma

SQL Server Hosting Toolkit

Merhabalar,


En çok aldığım ve gördüğüm sorulardan birisi şu: "Uygulamam için, uygulamamı geliştirdiğim bilgisayarımda bir de SQL Server' da bir veritabanım var. Şimdi bu uygulamamı internet ortamına taşımam gerekiyor. ASP.Net dosyalarımı FTP' den gönderiyorum, peki ya veritabanımı nasıl göndereceğim?". İşte bu yazımda, Web programcılığına yeni başlayan arkadaşların genelde bir sorun olarak karşılaştıkları bu işlemi, SQL Server Hosting Toolkit ile ne kadar kolay bir hale getirebileceğini anlatacağım.

Şunu baştan söylemek istiyorum, bu işlemi yapmanın sadece bir yolu yok; aslında bu yazımda diğer yöntemlerden de bahsedecektim, fakat gördüm ki sadece bu aracı anlatmak bile uzun sürdü. Bu nedenle diğer yöntemleri başka bir yazımda anlatırım. Dediğim gibi, bir veritabanındaki nesnelerin ve verilerin uzaktaki bir SQL Server Instance' ına gönderilmesi işlemi bir kaç yöntemle gerçekleştirilebilir. Tüm bu yöntemlerdeki temel işlem, ilgili nesnelerin Script' lerinin oluşturulması ve daha sonra da verilerin aktarılmasıdır.

SQL Server Hosting Toolkit
Öncelikle sizlere bu aracı indirebileceğiniz adresi vereyim: SQL Server Hosting Toolkit

Uygulamayı kurduktan sonra, kısayolunu "Başlat\Programlar\Microsoft SQL Server Database Publishing Wizard" olarak bulabilirsiniz.

Ayrıca, bu uygulama Visual Studio 2005 ve Visual Web Developer 2005 ürünleri ile de bütünleşik bir şekilde çalışmaktadır. Bu uygulamayı yükledikten sonra, Visual Studio içerisindeki "Server Explorer" isimli penceredeki bir veritabanı bağlantınızın üzerindeyken farenin sağ tuşuna tıklarsanız "Publish to Provider..." seçeneğini göreceksiniz. İşte bu seçeneğe tıklayarak, veritabanınızı uzaktaki SQL Server Instance' ına aktarmak için kullanacağınız SQL Server Hosting Toolkit' i açmak için kullanabilirsiniz.

Bunlara ek olarak, bu uygulamanın bir de Komut İstemcisi versiyonu mevcuttur. Yani sadece GUI' yi kullanarak değil, bu Komut İstemcisi uygulamasını da kullanarak aynı işlemleri yapmanız mümkündür.

Bu aracı kullanarak, veritabanınızı iki farklı yol ile uzaktaki SQL Server Instance' ınıza gönderebilirsiniz. Bunlar:

Database Publishing Wizard: Bu yöntem, genel olarak sorunsuz çalışan bir sistemdir. Veritabanlarını, uzaktaki SQL Server Instance' ına yüklemek isteyenlerin genelde kullanmak isteyeceği bir yöntem.
Database Publishing Services: Bu yöntem ise henüz tüm Hosting şirketleri tarafından kullanılmıyor. Çünkü bunun için, Barındırma şirketinin bu servisleri SQL Server sunucusuna kurması gerekiyor.

Uygulamayı çalıştırdığınızda, karşınıza ilk önce "hoş geldiniz" ekranı çıkacaktır. Burayı geçtikten sonra ise, aktarılacak veritabanını seçeceğiniz yerel SQL Server Instance' ınıza bağlanmak için gereken bilgileri girmeniz gereken "Select Source Server" penceresi ile karşılaşacaksınız. (bkz. Resim 1)




Resim 1


"Server" metin kutusuna, yerel bilgisayarınızda yüklü olan ve veritabanınızın bulunduğu SQL Server Instance' ının tam yolunu (\) yazın. Meselâ eğer bilgisayarınızda Visual Studio 2005 varsa, onunla birlikte de SQL Server 2005 Express Edition kurduysanız, yüklenen SQL Server Instance' ının varsayılan Instance' adı "SQLExpress" tir.

Diğer bir seçenek de, Instance' ınıza bir Bağlantı Metni (Connection String) kullanarak bağlanmaktır. Bunu da, yine aynı pencerede "Provide connection string" olarak bulabilirsiniz.

İlgili SQL Server Instance' ınıza bağlanmak için gereken bilgileri girdikten sonra "Next" düğmesine tıklayarak diğer pencereye geçin.

"Select Database" penceresinde (bkz. Resim 2), aktarmak istediğiniz veritabanını seçebilirsiniz. Bir seferde sadece bir veritabanı seçebilme hakkınız var.




Resim 2



Yine aynı pencerenin alt kısmında bir seçim kutusu göreceksiniz: "Script all objects in the selected database" (Seçili veritabanındaki tüm nesnelerin Script' ini oluştur.) Bu örnekte ben bu seçeneği işaretsiz bırakacağım, çünkü bu seçeneği seçtiğinizde, bu sihirbaz aktarabileceği tüm nesnelerin Script' ini oluşturacaktır. Benim bu seçeneği seçmememin nedeni ise, bir sonraki pencerede Script' lerinin oluşturulabileceği nesnelerin listesini görebilmenizdir. (bkz. Resim 3)




Resim 3



"Choose Object Types" te de görebileceğiniz gibi, ben sadece "Tables" nesneleri üzerinde işlem yapmak istediğimiz belirttim; durumunuza göre istediğiniz nesneleri seçebilirsiniz. (bkz. Resim 3) Ayrıca, veritabanınızda yukarıdaki tüm seçenekler çıkmayabilir. Bunun nedeni, veritabanınızda o nesnelerden bulunmamasıdır. Meselâ eğer veritabanınızda hiç "View" yoksa, o zaman bu pencerede "Views" seçeneğini göremezsiniz.

Aktarmak istediğiniz nesne grubunun adını seçtikten sonra -ki bizim örneğimizde bu "Tables", karşımıza "Choose Tables" penceresi çıkacak (bkz. Resim 4). Tahmin edebileceğiniz gibi, diğer nesneler için de ilgili diğer pencerelerle karşılaşacaksınız. Bu pencerelerde, o gruba ait hangi nesneleri aktarmak istediğinizi tek tek (veya hepsini) seçebileceksiniz.



Resim 4

Seçimlerinizi yaptıktan sonra sıra, Script dosyasının oluşturulacağı yeri ve gönderme şeklini belirlemeye geliyor. Biz, gönderme yöntemi olarak Script dosyasını oluşturma yöntemini kullanacağız. Çünkü şu anda çalıştığım barındırma şirketlerinden hiçbirisi Database Publishing Services hizmetini vermiyor.





Resim 5



"Select an Output Location" penceresinde Script dosyasını kaydedeceğiniz yeri seçtikten sonra, bu Script dosyasının oluşturulmasında kullanılacak seçeneklerin belirlenmesi için bir sonraki pencere olan "Select Publishing Options" penceresine (Resim 6) geçin.





Resim 6



Drop existing objects in script: Eğer değeri "True" ise hedefte aynı isimle zaten varolan nesneler bu Script dosyasındakilerle değiştirilir.

Schema qualify: Eğer değeri "True" ise üzerinde işlem yapılacak nesneler için Schema isimleri de kullanılır. (Örn:[SchemaAdı].[NesneAdı])

Script for target database: Script dosyasının SQL Server 2000 veya SQL Server 2005' e göre düzenlenmesi belirlenir.

Types of data to publish: Sadece Schema veya sadece veri veya her ikisinin de Script' lenmesi ayarları yapılır.

Bundan sonraki pencerede ise şu ana kadar yapmış olduğunuz seçimlerin listelendiği özet bölüm vardır ve bu sihirbazdaki son penceredir.

Tüm işlemleri tamamladınız ve elinizde veritabanınızın Script dosyası var. Şimdi, bu dosyayı kullanarak veritabanınızı uzaktaki SQL Server Instance' ında nasıl oluşturacağınızı anlatacağım. Bu işlem için bir kaç yöntem var, hangisinin en kolayı olduğu tabi size kalmış; fakat benim kendi yöntemim SQL Server Management Studio' yu kullanmak. Alternatif olarak SQLCMD ("sqlcmd.exe" SQL Server Instance' ınıza karşı işlem yapabileceğiniz ve SQL Server 2005 ve sonrası versiyonlarla gelen bir Komut İstemcisi uygulaması, önceki versiyonu ise "osql.exe" dir.) yi de kullanabilirsiniz.

Eğer bilgisayarınızda SQL Server Management Studio yok ise, SQL Server Management Studio Express aracını ücretsiz olarak buraya tıklayarak indirebilirsiniz. Bu aracın içerisinde, oluşturmuş olduğunuz *.SQL dosyasını çalıştırabileceğiniz "Query Editor" bölümü bulunmaktadır. (bkz. Resim 7)





Resim 7



SQL Server Management Studio' nun "File -> Open -> File with New Connection..." komutunu çalıştırın. Sizden, bir *.SQL dosyası açmanız beklenecektir. Database Publishing Wizard ile oluşturmuş olduğunuz dosyayı bulun ve açın. Daha sonra, bu dosyayı çalıştırmak için bağlanılacak olan SQL Server Instance' ının bilgilerini girmeniz istenecek. Bu bilgileri doğru bir şekilde girip SQL Server Instance' ınıza bağlandığınızda, Database Publishing Wizard ile hazırlamış olduğunuz *.SQL dosyasının da açıldığını göreceksiniz.

Veritabanınızı oluşturmak için son adım olarak Query Editor penceresindeki komutları çalıştırmak kaldı. Bu noktada, SQL Server Management Studio' nun "SQL Editor" araç çubuğundaki veritabanı listesinden doğru veritabanının seçili olduğundan emin olun. "Doğru veritabanı" derken, bu Script dosyasını çalıştıracağınız veritabanını kastediyorum. Şayet yanlış bir veritabanı seçiliyse, oluşturmuş olduğunuz bu Script dosyasındaki tüm nesneler yanlış veritabanında oluşturulacaktır. Bu yüzden doğru veritabanını seçmek gözden kaçırılmaması gereken önemli bir adım. Doğru veritabanını da seçtikten sonra, Script dosyasındaki komutları çalıştırmak için ya "F5" kısayol tuşunu veya yukarıdaki menüden "Query -> Execute" komutunu veya "SQL Editor" araç çubuğundaki "Execute" isimli düğmeye tıklamanız gerekiyor.

Özetle bu yazıda, Database Publishing Wizard ile, yerel SQL Server Instance' ınızda oluşturmuş olduğunuz veritabanınızı, uzaktaki başka bir SQL Server Instance' ında nasıl oluşturacağınızı anlatmaya çalıştım. Umarım işinize yarar.



Ekrem Önsoy

"The setup has encountered an unexpected error while Updating Installed Files. The error is: Fatal error during installation."

HATA MESAJI:
"The setup has encountered an unexpected error while Updating Installed Files. The error is: Fatal error during installation."

AÇIKLAMA:
Bir SQL Server 2005 Instance' ı yüklerken bu hata ile karşılaşabilirsiniz. Hatanın nedeni, kurulum yapıyor olduğunuz kullanıcının "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WMI\Security" isimli Kayıt Defteri (Regedit) yolunda yeterli izninin bulunmaması olabilir.

ÇÖZÜM:
Başlat\Çalıştır => "regedit" yazıp onayladığınızda Kayıt Defteri açılacaktır. Bahsini ettiğim anahtara ulaşın ve "Security" isimli anahtarın üzerinde farenin sağ tuşuna tıklayın ve "Permissions" (eğer sisteminiz Türkçe ise "İzinler") öğesine tıklayın. Kaşısınıza izinlerle ilgili bir pencere çıkacaktır. Bu pencerede eğer sizin Windows kullanıcınız veya kullanıcınızın dahil olduğu grup yoksa bunu listeye ekleyin.

Eğer kullanıcınız veya dahil olduğunuz grup zaten listede varsa, o zaman o kullanıcının\grubun izninin "Full Control" olduğundan emin olun.

SQL Server 2008: IntelliSense

SQL Server 2008' in CTP sürümleriyle çalışanlar bilir, SQL Server 2008 CTP5 ve CTP6' sında IntelliSense özelliği SQL Server' ın önceki sürümleri için de kullanılabiliyordu. Bunun nedeni, IntelliSense kullanımı için versiyon kontrolünün yapılmamasıydı. SQL Server 2008' in RTM sürümüyle birlikte, IntelliSense için versiyon kontrolü özelliği eklendi ve RTM versiyonundan itibaren IntelliSense özelliği sadece SQL Server 2008 Instance' larına karşı kullanılabilir hale getirildi. Buna neden olarak da, bu özelliğin SQL Server 2008 ile birlikte ilk defa kullanılması ve eski SQL Server versiyonlarında bu özellikle ilgili çeşitli sorunlar yaşanılması gösterildi.

SQL Server 2008 Enterprise Edition

SQL Server' ın eski versiyonlarını Windows masaüstü işletim sistemlerine kurmaya çalışanlar bilir ki, SQL Server' ın Enterprise Edition' ı Windows XP veya Vista gibi işletim sistemlerinin üzerine kurulamazdı. Microsoft, bu kuralı SQL Server 2008 ile değiştirdi. SQL Server 2008 Enterprise Edition, Windows Vista veya Windows XP gibi masaüstü işletim sistemlerine kurulabiliyor!

"The server principal 'LoginAdı' is not able to access the database 'VeritabanıAdı' under the current security context. (.Net SqlClient Data Provider)

HATA MESAJI:
"The server principal 'LoginAdı' is not able to access the database 'VeritabanıAdı' under the current security context. (.Net SqlClient Data Provider)"

AÇIKLAMA:
SQL Server Management Studio 2008 (RTM) kullanarak bir SQL Server 2005 Instance' ına bağlandığınızda ve "Object Explorer" penceresindeki "Databases" düğümü genişlettiğinizde bu hata ile karşılaşabilirsiniz.

ÇÖZÜM:
Bu, maalesef SSMS 2008 (RTM) ' in çok önemli başka bir hatası.

Bu hata ile her zaman karşılaşmazsınız. Şayet bağlandığınız SQL Server 2005 Instance' ındaki herhangi bir veritabanının "Auto Close" özelliğinin değeri "True" ise o zaman "Object Explorer" penceresindeki "Databases" düğümünü genişlettiğinizde bu hata ile karşılaşırsınız.

Üzgünüm, ama bu konuda herhangi bir çözüm şu anda yok. Bu ürün de piyasaya daha yeni sürüldüğü için, henüz yama veya güncellemesi yok. Bu konuda bir çözüm bulunduğunda, yine sitemde duyuracağım.

"Server user 'UserName' is not a valid user in database 'DatabaseName'. (Microsoft SQL Server, Error: 916)"

HATA MESAJI:
"Server user 'UserName' is not a valid user in database 'DatabaseName'. (Microsoft SQL Server, Error: 916)"

AÇIKLAMA:
SQL Server Management Studio 2008 (RTM) kullanarak bir SQL Server 2000 Instance' ına bağlandığınızda ve "Object Explorer" penceresindeki "Databases" düğümü genişlettiğinizde bu hata ile karşılaşabilirsiniz.

ÇÖZÜM:
Bu, maalesef SSMS 2008 (RTM) ' in çok önemli bir hatası. Umarım yakında bu sorunla ilgili bir yama çıkar. Eğer Servis Paketini beklersek daha çok bekleyeceğiz...

Hatanın nedenine gelince, SSMS 2008 (RTM) ile bir SQL Server 2000 Instance' ına bağlandığınızda, SSMS sizin erişim hakkınız olan veya olmayan tüm veritabanlarına ait bazı bilgileri toplamaya çalışıyor. Haliyle, sizin kullanıcınızın erişim hakkı olmayan bir veritabanı olduğunda, bu hata ile karşılaşıyorsunuz ve "Object Explorer" penceresindeki "Databases" düğümünün altında hiç bir veritabanı gösterilmemiş oluyor.

Size bu konuda SQL Server Management Studio 2005' i kullanmanızı tavsiye etmekten başka bir çözüm önerim yok şimdilik. Eğer bulunursa veya bulursam, bu Hata ve Çözüm yazımı yeniden düzenlerim.

SQL Server 2008: Sparse Columns

Merhaba,


Kısaca, eğer bir alan içerisindeki (sütun) verilerin çoğunluğunu NULL değeri oluşturuyorsa, o zaman bu alanda veri tasarrufu sağlamak için bu alanın "Sparse" özelliğini etkinleştirirsiniz. "Sparse" özelliği, bu alanda saklanacak olan NULL değerleri için diskte daha az yer harcanmasını sağlayacaktır.

Tabi bunun da bir bedeli vardır, NULL olmayan alanlardaki veriler için harcanacak yer fazlalaşacaktır. Bu yüzden "Sparse" ı kullanmak için aklınızda bulundurmanız gereken altın kural, bu özelliği kullanacağınız alandaki değerlerin büyük çoğunluğunun NULL olması gerektiğidir. Bu değerler hakkında fikir sahibi olmak için aşağıdaki örnekleri inceleyebilirsiniz.

Her alan ve veritipinin de "Sparse" özelliği kullanılamaz, buna aşağıdaki örnekten sonra değineceğim.


Nasıl Kullanılır?

Bir alanı "Sparse" olarak belirlemek için ise CREATE TABLE veya ALTER TABLE komutlarını kullanmalısınız. Bu komutların SQL Server 2008 versiyonları hakkında daha fazla bilgi için buraya tıklayın.

Misal olarak aşağıdaki örneği uygulayın:

CREATE TABLE SparseOlmayanTablo(a int, b int, c int, d int)
GO

CREATE TABLE SparseOlanTablo(a int, b int SPARSE, c int SPARSE, d int SPARSE)
GO

DECLARE @i int=0
WHILE @i < 100000
BEGIN
INSERT INTO SparseOlanTablo VALUES (@i,null,null,null)
INSERT INTO SparseOlmayanTablo VALUES (@i,null,null,null)
SET @i+=1
END

Yukarıdaki işlem tamamlandıktan sonra da, hangi tabloda ne kadar alan kullanıldığını belirlemek için aşağıdaki satırları çalıştırın:

exec sp_spaceused SparseOlmayanTablo
exec sp_spaceused SparseOlanTablo

Bu iki komutu da çalıştırdıktan sonra, aşağıdaki gibi bir sonuç görmeniz gerekiyor:



Resim 1



Gördüğünüz gibi, iki tablo aynı alanları içerse de, "Sparse" özelliğini kullandığımız tablo diğer tabloya nazaran diskte %50 daha az yer kaplıyor.

"Sparse" özelliğinin veri depolanmasını nasıl etkileyebileceğini daha ayrıntılı bir şekilde anlatabilmek için bir de şu örneğe bakın

Örnek: 2
Tablo isimlerinin sonunda "N" olan tablolara NULL değerler koyacağız, diğerlerine ise sırayla bir sayı kaydedilecek.

DROP TABLE SparseOlanTablo
GO

DROP TABLE SparseOlmayanTablo
GO

CREATE TABLE SparseOlanTablo(a int SPARSE)
GO

CREATE TABLE SparseOlanTabloN(a int SPARSE)
GO

CREATE TABLE SparseOlmayanTablo(a int)
GO

CREATE TABLE SparseOlmayanTabloN(a int)
GO

Yine bir önceki örnekteki WHILE döngüsünü 3 kere kullanın. Birinci seferde 1.000 kayıt girin. İkinci seferde 10.000 ve üçüncü seferde de 100.000 kayıt girin. (Not: Kendi yaptığım örnekte, her yeni bir döngüye başlamadan önce tabloların içini boşalttım.)

DECLARE @i int=0
WHILE @i < 1000
BEGIN
INSERT INTO SparseOlanTablo VALUES (@i)
INSERT INTO SparseOlanTabloN VALUES (null)
INSERT INTO SparseOlmayanTablo VALUES (@i)
INSERT INTO SparseOlmayanTabloN VALUES (null)
SET @i+=1
END

Bunların sonucu ise aldığım "data" alanının (yani verilerin diskte ne kadar yer kapladıkları) değerleri şöyle:


Satır Sayısı SparseOlanTablo SparseOlanTabloN SparseOlmayanTablo SparseOlmayanTabloN
1.000 24KB 16KB 16KB 16KB
10.000 232KB 120KB 136KB 136KB
100.000 2288KB 1144KB 1352KB 1352KB



Gördüğünüz gibi, "Sparse" özelliğini kullandığımızda eğer tabloda hiç NULL değer yoksa, o zaman bu bize kârdan çok zarar verecektir. 100.000 kayıt girildiğinde "Sparse" özelliğini kullandığımız SparseOlanTablo isimli tablonun diskte kapladığı alan 2.288KB, fakat "Sparse" özelliği kapalı olan tablo olan SparseOlmayanTablo isimli tablonun diskte kapladığı alan ise 1.352KB. İkisinde de aynı veriler var.

Şimdi başka bir örnek daha yapacağız. Bu örnekte ise, SparseOlanTablo' daki verilerin %90' ı NULL olacak, %10' u ise sayılardan ibaret olacak.

Örnek: 3
DROP TABLE SparseOlanTablo
GO

DROP TABLE SparseOlmayanTablo
GO

CREATE TABLE SparseOlanTablo(a int SPARSE)
GO

CREATE TABLE SparseOlmayanTablo(a int)
GO

DECLARE @i int=0
WHILE @i < 10000
BEGIN
INSERT INTO SparseOlanTablo VALUES (@i)
INSERT INTO SparseOlmayanTablo VALUES (@i)
SET @i+=1
END

Yukarıdaki döngüyle birlikte, tablolarımıza on bin kayıtlık sayı girmiş olduk. Şimdi de doksan bin kayıtlık NULL veri gireceğiz.

DECLARE @i int=0
WHILE @i < 90000
BEGIN
INSERT INTO SparseOlanTablo VALUES (null)
INSERT INTO SparseOlmayanTablo VALUES (null)
SET @i+=1
END



Satır Sayısı SparseOlanTablo SparseOlmayanTablo
10.000 (Sayı) 264KB 136KB
90.000 (NULL) + 10.000 (Sayı) 1264KB 1352KB
900.000 (NULL) + 100.000 (Sayı) 12576KB 13520KB



Bu örneklerde hep "int" veritipini kullandık. Unutmayın ki, "Sparse" özelliğinin kullanımı değişik veritiplerinin kullanımında değişik sonuçlar verecektir.


"Sparse" Özelliğine SQL Server Management Studio ile Ulaşmak

Bu özelliğe, SQL Server Instance' larının yönetilmesi amacıyla kullanılan SQL Server Management Studio (SSMS)' dan ulaşmak için aşağıdaki adımları izleyin:
- SSMS' i başlatın,
- Çalışma yapacağınız SQL Server Instance' ına bağlanın,
- Object Explorer' dan ilgili veritabanınızdaki tablonuzu bulun ve üzerinde farenin sağ tuşua tıklayarak "Design" seçeneğini seçin,
- "Sparse" özelliğini (bkz Resim 2) açılan penceredeki Column Properties' de bulacaksınız.




Resim 2



"Sparse" Kullanımının Tespiti

Bir tablodaki bir alanın "Sparse" özelliğinin kullanılıp kullanılmadığını anlamak için ise aşağıdaki komutu kullanabilirsiniz:

SELECT COLUMNPROPERTY(object_id('dbo.SparseOlanTablo'),'b','IsSparse')

Eğer sonuç olarak "1" dönüyorsa, o zaman sorguladığınız alanın "Sparse" özelliği kullanılıyordur.


"Sparse" Özelliğinin Kullanım Kısıtlamaları

Yukarıda değineceğimi söylediğim gibi, "Sparse" özelliği her zaman ve her veritipi için kullanılamaz. Meselâ şu veritipleri kullanılan alanlarda "Sparse" özelliği kullnılamaz: geography, geometry, image, ntext, text, timestamp, user-defined data type.

Bunlardan başka, "Sparse" özelliği açık olduğunda, bu alan için bir "Default" değer tanımlanamaz. Bu alan bir "Rule" e bağlanılamaz. Bir "Computed Column" un, "Sparse" özelliği etkinleştirilemez. "Sparse" özelliği açık olan bir alan, bir "Clustered Index" veya bir "Unique Primary Key Index" in parçası olamaz.

Bunlar gibi kısıtlamalar ve "Sparse" ın hangi SQL Server teknolojileri ile kullanılabileceği hakkında daha fazla bilgi için buraya yıklayın.



Ekrem Önsoy

SQL Server 2008: Sertifikasyon 2

Merhaba arkadaşlar,



Takip edenler bilirler, bu konu hakkında daha önceden de bir yazı yazmıştım. (okumak için buraya tıklayın) Artık, SQL Server 2008' in sertifikasyonu hakkında daha net bilgiler var elimde. Bir mânâda da bu konunun devamı olarak görülebilecek bu yazımda, bu ürünün sertifikasyonu konusunda daha net bilgi edinebileceksiniz.



SQL Server 2008 Sertifikasyonunun Yol Haritası

Öncelikle size SQL Server 2008 Sertifikasyonunun yol haritasını göstermek istiyorum.

Bilenleriniz de olabilir, bilmeyenleriniz de; SQL Server 2005 Sertifikasyonunda MCTS (Microsoft Certified Technology Specialist) sertifikası için iki sınav vardı:
1. MCTS: SQL Server 2005
2. MCTS: SQL Server 2005 Business Intelligence

SQL Server 2008 Sertifikasyonunda ise MCTS sınavlarını da dallandırmışlar, yani artık her alanın kendi MCTS sınavı var, şöyle:
1 MCTS: SQL Server 2008, Implementation and Maintenance (70-432) (30 Eylül 2008)
2 MCTS: SQL Server 2008, Database Development (70-433) (10 Aralık 2008)
3 MCTS: SQL Server 2008 BI Development and Maintenance (70-448) (30 Eylül 2008)

Dikkatinizi çektiyse, yukarıda bulunan ve SQL Server 2008 sertifikasyonuna ait MCTS sınavları için bazı tarihler de yazdım. İşte bu tarihler, bu sınavların yürürlüğe girmesi beklenen tarihler. Bunları tabi ki ben uydurmadım, Microsoft Learning'in verdiği bilgi bu yönde.

Ayrıca, bu sınavlar hakkında daha fazla bilgi almak ve sınavlar yayınlanır yayınlanmaz bu sınavlara girmek isteyen (ve tabi ki bu erken sınav girişleri için de indirim almak isteyen)arkadaşlar şu adresten yararlanabilirler:
http:/www.microsoft.com/learning/mcp/sqlvs/offer/default.mspx



Peki ya MCITP sınavları?

Evet! Bu sınavlar konusunda da değişiklikler var arkadaşlar.

MCITP: Database Administrator 2008 70-450 PRO: Designing, Optimizing and Maintaining a Database Server Infrastructure using SQL Server 2008 (12 Kasım 2008)

MCITP: Database Developer 2008 70-451 PRO: Designing Database Solutions and Data Access Using SQL Server 2008 (26 Kasım 2008)

MCITP: BI Developer 2008 70-452 PRO: Designing a Business Intelligence Infrastructure using SQL Server 2008 (6 Kasım 2008)

Artık MCITP sertifikasını kazanmak için SQL Server 2005' te olduğu gibi iki sınava girmek gerekmiyor, bir sınav yetiyor. Yani diyelim ki "SQL Server 2008 Database Administrator" sertifikasını kazanmak istiyorsunuz. O zaman bunun için iki sınava girmeniz yeterli. Bu sınavlar: "MCTS: SQL Server 2008, Implementation and Maintenance" ve "MCITP: Database Administrator 2008 70-450 PRO: Designing, Optimizing and Maintaining a Database Server Infrastructure using SQL Server 2008".

SQL Server 2008' in herhangi bir MCTS sertifikasına, SQL Server 2005 MCTS' ten yükseltme (Upgrade) yok. Çünkü zaten MCTS: SQL Server 2008 sertifikaları için bir sınav yetiyor.



Yükseltme Sınavları

SQL Server 2008' in MCITP sertifikalarına yükseltme yapmak için ise, ilgili alana denk olan başka bir MCITP sertifikasına sahip olmalısınız. Yani bu durumda diyelim ki eğer SQL Server 2005 MCITP: Database Administrator sertifikanız yoksa, o zaman SQL Server 2008 MCITP: Database Administrator sertifikasına yükseltme yapamazsınız.

MCDBA sertifikasından da doğrudan SQL Server 2008' in herhangi bir sertifikasına yükseltme yapma şansınız yok. Eğer MCDBA sertifikanız varsa, SQL Server 2008' e ancak şu şekilde yükseltme yapabilirsiniz: Öncelikle SQL Server 2005' e yükseltme yapmak için 2 sınava girmeniz gerekecek, daha sonra da SQL Server 2005' ten SQL Server 2008' in ilgili alanına yükseltme yapacaksınız.

Yükseltme sınavları ise şunlar:
70-453 UPGRADE: Transition your MCITP DBA Skills to MCITP DBA 2008. Bir sınavla hem MCTS: DBA 2008, hem de MCITP: DBA 2008' i kazanmış olursunuz.

70-454 UPGRADE: Transition your MCITP DBD Skills to MCITP DBD 2008. Bir sınavla hem MCTS: DBD 2008, hem de MCITP: DBD 2008' i kazanmış olursunuz.

70-455 UPGRADE: Transition your MCITP BID Skills to MCITP BID 2008. Bir sınavla hem MCTS: BID 2008, hem de MCITP: BID 2008' i kazanmış olursunuz.



Ömrünü Tamamlayacak Sınavlar

SQL Server 2000' in sınavları (70-228 ve 70-229) 31 Mart 2009' da ömürlerini tamamlamış olacaklar. Microsoft, MCDBA sertifikasını kazanmanız adına eğer eksik sınavlarınız kaldıysa, bunları tamamlamanız için sizi teşvik ediyor. Bu nedenle de 1 Eylül 2008' den itibaren bu sınavlar herhangi bir Voucher Kodu veya başka bir kod gerektirmeden, bu tarihten sonra yapacağınız ve sınavlar yürürlükte kalana kadar %40 indirimli olacaklar.

SQL Server 2008 Sertifikasyonu hakkında daha fazla bilgi edinmek için aşağıdaki adresi ziyaret edebilirsiniz:
http://www.microsoft.com/learning/mcp/sql/2008/default.aspx

SQL Server 2008 hakkında daha fazla bilgi için ise şu adres işinize yarayabilir:
http://www.microsoft.com/learning/sql/2008/default.mspx




Ekrem Önsoy

"RESTORE cannot process database 'DenemeDB' because it is in use by this session. It is recommended that the master database be used when performing t

HATA MESAJI:
"RESTORE cannot process database 'DenemeDB' because it is in use by this session. It is recommended that the master database be used when performing this operation."

AÇIKLAMA:
Bir SQL Server 2005 veritabanını açmaya (RESTORE) çalışırken bu hata mesajı ile karşılaşabilirsiniz.

Bu hata mesajından, açmaya çalıştığınız veritabanına birisinin (veya kendinizin) bağlı olduğunu anlayabilirsiniz.

Meselâ, "DenemeDB" isimli bir veritabanınız var diyelim ve bu veritabanının üzerine, yine aynı bu isimle bir veritabanı açmaya çalışıyorsunuz; işte bu anda eğer "DenemeDB" isimli veritabanına açık birbağlantı varsa, bu hata mesajı ile karşılaşırsınız.

ÇÖZÜM:
Bu sorundan kurtulmak için, açma işlemini yapmadan önce aşağıdaki komutu kullanıp etkin veritabanı olarak MASTER veritabanını seçmelisiniz.

USE MASTER

Not:
Bilmeyenler için, "Master" sistem veritabanı, SQL Server' ın 5 ana sistem veritabanından (Master, Msdb, Model, Tempdb, Resource) birisidir. SQL Server' ın sistem veritabanları hakkında daha fazla bilgi için şu adresi ziyaret edebilirsiniz: http://msdn.microsoft.com/en-us/library/ms178028.aspx

"[Microsoft][ODBC SQL Server Driver][DBMSLPCN]SQL Server does not exist or access denied."

HATA MESAJI:
[Microsoft][ODBC SQL Server Driver][DBMSLPCN]SQL Server does not exist or access denied."

AÇIKLAMA:
Bir SQL Server 2000 Instance' ına bağlanmaya çalışırken bu hata mesajı ile karşılaşabilirsiniz.

ÇÖZÜM:
Bir olmayan bir SQL Server 2000 Instance' ına bağlanmaya çalışırsanız, bu hata mesajı ile karşılaşmanız büyük olasılıktır.

Örneğin, kurulu ve çalışan bir SQL Server 2000 Instance' ımız olsun ve bunun da Instance adı "Test_Instance" olsun. Buna bağlanmak için gerek Bağlantı Metnimizde gerek herhangi bir SQL Server GUI' sinde sunucu adı olarak "\" şeklinde bir biçim kullanmamız gerekir. Bilgisayarımın adına da "EKREM-PC" dersek, bu durumda benim SQL Server' ım için kullanacağım sunucu adı şöyle olacaktır: "EKREM-PC\Test_Instance".

Eğer yukarıdaki şekilde değil de, sadece "Test_Instance" yazsaydım veya bir yazım yanlışı yapsaydım, o zaman yukarıdaki hata ile karşılaşırdım.

2 Eylül 2008 Salı

"Msg 14684, Level 14, State 1, Procedure sp_syscollector_create_collection_set, Line 203

HATA MESAJI:
"Msg 14684, Level 14, State 1, Procedure sp_syscollector_create_collection_set, Line 203

Caught error#: 2627, Level: 14, State: 1, in Procedure: sp_syscollector_create_collection_set, Line: 137, with Message: Violation of UNIQUE KEY constraint 'UQ_syscollector_collection_sets_internal_name'. Cannot insert duplicate key in object 'dbo.syscollector_collection_sets_internal'."

AÇIKLAMA:
SQL Server 2008' de, "sp_syscollector_create_collection_set" Stored Procedure' ını kullanarak bir Collection Set oluşturmak istediğinizde böyle bir hata ile karşılaşabilirsiniz.

Bunun nedeni, oluşturmaya çalıştığınız Collection Set ile aynı ada sahip olan ve zaten oluşturulmuş bir Collection Set' in bulunmasıdır.

ÇÖZÜM:
Collection Set oluşturma örneği:

USE msdb
GO
DECLARE @mycollection_set_id int
DECLARE @mycollection_set_uid UNIQUEIDENTIFIER
EXEC [dbo].[sp_syscollector_create_collection_set]
@name=N'BaziBilgiler',
@collection_mode=1,
@description=N'... ... hakkında bilgi toplama',
@target=N'',
@logging_level=1,
@days_until_expiration=90,
@proxy_name=N'',
@schedule_name=N'CollectorSchedule_Every_6h',
@collection_set_id=@mycollection_set_id OUTPUT,
@collection_set_uid=@mycollection_set_uid OUTPUT

Bu hatayı almamak için, bu örnekteki @Name isimli parametrede kullandığınız değeri değiştirmeniz yeterli olacaktır.

"Length of LOB data (xxxxx) to be replicated exceeds configured maximum 65536. The statement has been terminated."

HATA MESAJI:
"Length of LOB data (xxxxx) to be replicated exceeds configured maximum 65536. The statement has been terminated."

AÇIKLAMA:
Replication işlemi yaptığınız bir sistemde böyle bir hata ile karşılaşabilirsiniz.

LOB verilerinin replike edilmesi için kullanılan varsayılan sayı 65536' dır. Eğer Replication işlemini bundan daha büyük bir veri ile gerçekleştiriyorsanız bu hata ile karşılaşabilirsiniz.

ÇÖZÜM:
Query Editor' e aşağıdaki komutu ihtiyacınıza göre girip çalıştırırsanız bu tavan değerini değiştirebilirsiniz. Böylece bu sorundan kurtulursunuz.

sp_configure 'max text repl size', '9000000'
GO
RECONFIGURE

Buradaki "9000000" sayısı bir örnektir. Meselâ aşağıdaki hatayı aldığınızı varsayalım:
"Length of LOB data (70897) to be replicated exceeds configured maximum 65536. The statement has been terminated."

O zaman yukarıdaki komutu verdiğim örnekteki gibi çalıştırırsanız bu hata mesajını almazsınız. Ta ki daha büyük bir replike işlemi yapılıncaya kadar.

"SQL Server Setup failed to obtain system account information for the ASPNET account. To proceed, reinstall the .NET framework, and then run SQL Serve

HATA MESAJI:
"SQL Server Setup failed to obtain system account information for the ASPNET account. To proceed, reinstall the .NET framework, and then run SQL Server Setup again."

AÇIKLAMA:
SQL Server 2005 Setup sırasında, "Report Server Installation" penceresindeyken bu hata mesajı ile karşılaşabilirsiniz.

ÇÖZÜM:
Bir komut istemcisi penceresi açın (Başlat\Çalıştır -> cmd).

Komut istemcisi içerisinden şu klasöre gidin: "C:\Windows\Microsoft.NET\Framework\v2.0.50727" ve şu komutu çalıştırın: "aspnet_regiis.exe -i" (tabi tırnaklar olmadan).

aspnet_regiis uygulaması hakkında daha fazla bilgi almak için buraya tıklayın.

"Value does not fall within the expected range. (SqlMgmt)"

HATA MESAJI:
"Value does not fall within the expected range. (SqlMgmt)"

AÇIKLAMA:
SQL Server Management Studio' dan, bir Database Role' ün özelliklerine girip, açılan "Database Role Properties" penceresindeki "Securables" sayfasını açmaya çalıştığınızda böyle bir hata ile karşılaşabilirsiniz.

ÇÖZÜM:
Bu ve buna benzer bir çok hata Servis Paketleriyle düzeltildi. Bu nedenle, SQL Server 2005' in en son yayınlanmış servis paketini, Client Tools' a da uygulamanız bu sorunu çözecektir.

SQL Server 2005' in en son servis paketini nasıl edinceğiniz hakkında daha fazla ve en güncel bilgiyi edinmek için buraya tıklayın.

"An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that

HATA MESAJI:
"An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified) (.Net SqlClient Data Provider)"

AÇIKLAMA:
Bir SQL Server 2005 Instance' ına bağlanırken, eğer yanlış bir Instance adı kullandıysanız bu hata ile karşılaşırsınız.

ÇÖZÜM:
Eğer bağlanmaya çalıştığınız SQL Server Instance' ı bir Named Instance ise, o zaman Instance adı olarak aşağıdaki biçimi kullanmalısınız:

\

Örnek:
EKREM-PC\DeveloperEdition

Yukarıdaki örneğe göre "EKREM-PC" bilgisayarımın adı. "Developer Edition" ise, bağlanmaya çalıştığım SQL Server 2008 Instance' ını kurarken ona verdiğim isim.

Eğer bağlanmaya çalıştığınız SQL Server Instance' ı bir Default Instance ise, o zaman Instance adı olarak aşağıdaki biçimi kullanmalısınız:



Örnek:
EKREM-PC

Yukarıdaki örneğe göre "EKREM-PC" bilgisayarımın adı. Eğer SQL Server 2008 kurulumunda Instance adıyla ilgili pencerede "Default Instance" seçeneğini seçerseniz, SQL Server Instance' ınızın adı sadece bilgisayar adından oluşur.

"An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that

HATA MESAJI:
"An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (Provider: Names Pipes Provider, Error: 40 - Could not open a connection to SQL Server) (Microsoft SQL Server, Error: 53)"

AÇIKLAMA:
Bir SQL Server 2008 Instance' ına bağlanırken, eğer yanlış bir Instance adı kullandıysanız bu hata ile karşılaşırsınız.

ÇÖZÜM:
Eğer bağlanmaya çalıştığınız SQL Server Instance' ı bir Named Instance ise, o zaman Instance adı olarak aşağıdaki biçimi kullanmalısınız:

\

Örnek:
EKREM-PC\DeveloperEdition

Yukarıdaki örneğe göre "EKREM-PC" bilgisayarımın adı. "Developer Edition" ise, bağlanmaya çalıştığım SQL Server 2008 Instance' ını kurarken ona verdiğim isim.

Eğer bağlanmaya çalıştığınız SQL Server Instance' ı bir Default Instance ise, o zaman Instance adı olarak aşağıdaki biçimi kullanmalısınız:



Örnek:
EKREM-PC

Yukarıdaki örneğe göre "EKREM-PC" bilgisayarımın adı. Eğer SQL Server 2008 kurulumunda Instance adıyla ilgili pencerede "Default Instance" seçeneğini seçerseniz, SQL Server Instance' ınızın adı sadece bilgisayar adından oluşur.

"The index "Index_adı" (partition ) on table "Tablo_adı" cannot be reorganized because page level locking is disabled"

HATA MESAJI:
"The index "Index_adı" (partition ) on table "Tablo_adı" cannot be reorganized because page level locking is disabled"

AÇIKLAMA:
Eğer Reorganize işlemini uygulayacağınız Index' iniz "Disabled" durumda ise veya "ALLOW_PAGE_LOCKS" seçeneği "OFF" durumunda ise bu hata mesajı ile karşılaşırsınız ve Reorganize işlemi başarısızlıkla sonuçlanır.

ÇÖZÜM:
Index' inize Reorganize işlemini uygulamak için eğer Index' iniz "Disabled" durumunda ise "Enabled" duruma getirmelisiniz. Index' inizi etkin duruma (Enabled) getirmek için aşağıdaki kodu kullanabilirsiniz:

ALTER INDEX Index_adı ON Tablo_adı REBUILD

Eğer Index' inizin "ALLOW_PAGE_LOCKS" seçeği "OFF" durumunda ise, o zaman "ON" durumuna getirmelisiniz. Bunun için aşağıdaki kodu kullanabilirsiniz:

ALTER INDEX Index_adı ON Tablo_adı SET (ALLOW_PAGE_LOCKS = ON)

"Could not start the network library because of an internal error in the network library. To determine the cause, review the errors immediately preced

HATA MESAJI:
"Could not start the network library because of an internal error in the network library. To determine the cause, review the errors immediately preceding this one in the error log."

AÇIKLAMA:
Yeni yüklediğiniz bir SQL Server 2005 Instance' ını açmaya çalışırken Setup Log dosyasında bu ve diğer bazı hata mesajlarıyla (hata90 hata91 hata92) karşılaşabilirsiniz.

ÇÖZÜM:
Bu hata ile karşılaştığım durumda, bu sorunun yaşandığı bilgisayarda McAfee yüklüydü ve bu uygulama durdurulduğunda, artık SQL Server servisi çalıştırılabiliyordu.

Sorun açıkça, McAfee' nin SQL Server Instance' ının kullanacağı portu ve SQL Server servisini engellemesinden kaynaklanıyordu.

McAfee programında, SQL Server' ın çalışabilmesi için gerekli ayarlar yapıldıktan sonra sorun çözüldü.

"SQL Server could not spawn FRunCM thread. Check the SQL Server error log and the Windows event logs for information about possible related problems."

HATA MESAJI:
"SQL Server could not spawn FRunCM thread. Check the SQL Server error log and the Windows event logs for information about possible related problems."

AÇIKLAMA:
Yeni yüklediğiniz bir SQL Server 2005 Instance' ını açmaya çalışırken Setup Log dosyasında bu ve diğer bazı hata mesajlarıyla (hata90 hata91 hata92) karşılaşabilirsiniz.

ÇÖZÜM:
Bu hata ile karşılaştığım durumda, bu sorunun yaşandığı bilgisayarda McAfee yüklüydü ve bu uygulama durdurulduğunda, artık SQL Server servisi çalıştırılabiliyordu.

Sorun açıkça, McAfee' nin SQL Server Instance' ının kullanacağı portu ve SQL Server servisini engellemesinden kaynaklanıyordu.

McAfee programında, SQL Server' ın çalışabilmesi için gerekli ayarlar yapıldıktan sonra sorun çözüldü.

"TDSSNIClient initialization failed with error 0x2726, status code 0x1."

HATA MESAJI:
"TDSSNIClient initialization failed with error 0x2726, status code 0x1."

AÇIKLAMA:
Yeni yüklediğiniz bir SQL Server 2005 Instance' ını açmaya çalışırken Setup Log dosyasında bu ve diğer bazı hata mesajlarıyla (hata90 hata91 hata92) karşılaşabilirsiniz.

ÇÖZÜM:
Bu hata ile karşılaştığım durumda, bu sorunun yaşandığı bilgisayarda McAfee yüklüydü ve bu uygulama durdurulduğunda, artık SQL Server servisi çalıştırılabiliyordu.

Sorun açıkça, McAfee' nin SQL Server Instance' ının kullanacağı portu ve SQL Server servisini engellemesinden kaynaklanıyordu.

McAfee programında, SQL Server' ın çalışabilmesi için gerekli ayarlar yapıldıktan sonra sorun çözüldü.

"TDSSNIClient initialization failed with error 0x2726, status code 0xa."

HATA MESAJI:
"TDSSNIClient initialization failed with error 0x2726, status code 0xa."

AÇIKLAMA:
Yeni yüklediğiniz bir SQL Server 2005 Instance' ını açmaya çalışırken Setup Log dosyasında bu ve diğer bazı hata mesajlarıyla (hata90 hata91 hata92) karşılaşabilirsiniz.

ÇÖZÜM:
Bu hata ile karşılaştığım durumda, bu sorunun yaşandığı bilgisayarda McAfee yüklüydü ve bu uygulama durdurulduğunda, artık SQL Server servisi çalıştırılabiliyordu.

Sorun açıkça, McAfee' nin SQL Server Instance' ının kullanacağı portu ve SQL Server servisini engellemesinden kaynaklanıyordu.

McAfee programında, SQL Server' ın çalışabilmesi için gerekli ayarlar yapıldıktan sonra sorun çözüldü.

"MSP Error: 29565 SQL Server Setup cannot upgrade the specified instance because the previous upgrade did not complete. Start the Remote Registry serv

HATA MESAJI:
"MSP Error: 29565 SQL Server Setup cannot upgrade the specified instance because the previous upgrade did not complete. Start the Remote Registry service and go to Add/Remove Programs, select the Change button for Microsoft SQL Server 2005, and then select SQL instance TEST3 and complete the setup."

AÇIKLAMASI:
SQL Server 2005 Servis Paketi 2' yi yüklerken, bu güncellemeyi yapmaya çalıştığınız SQL Server 2005 Instance' ının Database Engine' inin güncellemesinin başarısız olduğunu gösteren "Failed" ibaresiyle karşılaşabilir ve ardından da "Summary Log" una baktığınız da bu başarısızlığın nedeni olarak yukarıda yazan hata mesajını görebilirsiniz.

ÇÖZÜMÜ:
Bu hata mesajının nedeni aslında hata mesajının içinde bariz bir şekilde yazıyor. Güncellemenin hata ile sonuçlandığı bu SQL Server 2005 Instance' ının önceki güncellenmesi bir şekilde tamamlanmamış. Bu, güncelleme esnasında oluşan herhangi bir kesintiden kaynaklanıyor olabilir.

Sorunu aşmak ve güncelleme işlemini tamamlamak için:
- Denetim Masasını açın,
- Program Ekle\Kaldır' dan, "Microsoft SQL Server 2005" i seçin ve "Değiştir" düğmesine tıklayın.
- Açılan "Microsoft SQL Server 2005 Maintanence" pencereden, güncelleme işlemini uygulamak istediğiniz SQL Server 2005 Instance' ını seçin ve ilerleyin.
- "Change or Remove Instance" penceresindeki "Complete the suspended installation" düğmesine tıklayın ve ilerleyin.

Böylece önceki yarım kalan işleminiz tamamlanmış olacaktır.

5 Ağustos 2008 Salı

"SQL Server setup could not connect to the database to validate upgrade options. The error was: [Microsoft][ODBC Driver Manager] Data source name not

HATA MESAJI:
"SQL Server setup could not connect to the database to validate upgrade options. The error was: [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified"

AÇIKLAMA:
SQL Server 2000 Instance' ınızı, SQL Server 2005' e yükseltirken bu hata ile karşılaşabilirsiniz.

ÇÖZÜM:
Benim bu hatanın nedenine şahit olduğum durumda, sorun, SQL Native Client idi. SQL Native Client ya düzgün yüklenememişti, ya da buna benzer başka bir sorun olmuştu.

Gene aynı durumda SQL Native Client, Program Ekle\Kaldır' dan da temiz bir şekilde kaldırılamamıştı. SQL Native Client ile ilgili dosyalar ve kayıtlar elle kaldırılmıştı ve büyük ihtimalle sorunu da "system32\sqlncli.dll" dosyasının silinmesi çözmüştü.

"MSP Error: 29565 SQL Server Setup cannot upgrade the specified instance because the previous upgrade did not complete. Start the Remote Registry serv

HATA MESAJI:
"MSP Error: 29565 SQL Server Setup cannot upgrade the specified instance because the previous upgrade did not complete. Start the Remote Registry service and go to Add/Remove Programs, select the Change button for Microsoft SQL Server 2005, and then select SQL instance TEST3 and complete the setup."

AÇIKLAMA:
SQL Server 2005 Servis Paketi 2' yi yüklerken, bu güncellemeyi yapmaya çalıştığınız SQL Server 2005 Instance' ının Database Engine' inin güncellemesinin başarısız olduğunu gösteren "Failed" ibaresiyle karşılaşabilir ve ardından da "Summary Log" una baktığınız da bu başarısızlığın nedeni olarak yukarıda yazan hata mesajını görebilirsiniz.

ÇÖZÜM:
Bu hata mesajının nedeni aslında hata mesajının içinde bariz bir şekilde yazıyor. Güncellemenin hata ile sonuçlandığı bu SQL Server 2005 Instance' ının önceki güncellenmesi bir şekilde tamamlanmamış. Bu, güncelleme esnasında oluşan herhangi bir kesintiden kaynaklanıyor olabilir.

Sorunu aşmak ve güncelleme işlemini tamamlamak için:
- Denetim Masasını açın,
- Program Ekle\Kaldır' dan, "Microsoft SQL Server 2005" i seçin ve "Değiştir" düğmesine tıklayın.
- Açılan "Microsoft SQL Server 2005 Maintanence" pencereden, güncelleme işlemini uygulamak istediğiniz SQL Server 2005 Instance' ını seçin ve ilerleyin.
- "Change or Remove Instance" penceresindeki "Complete the suspended installation" düğmesine tıklayın ve ilerleyin.

Böylece önceki yarım kalan işleminiz tamamlanmış olacaktır.

"Database mirroring is disabled by default. Database mirroring is currently provided for evaluation purposes only and is not to be used in production

HATA MESAJI:
"Database mirroring is disabled by default. Database mirroring is currently provided for evaluation purposes only and is not to be used in production environments. To enable database mirroring for evaluation purposes, use trace flag 1400 during startup. For more information about trace flags and startup options, see SQL Server Books Online. (Microsoft SQL Server, Error: 1498)"

AÇIKLAMA:
Yeni bir SQL Server 2005 Instance' ı kurup, Database Mirroring' i yapılandırmaya çalıştığınızda bu hata mesajı ile karşılaşabilirsiniz.

Nedeni ise, SQL Server 2005 ilk çıktığında SQL Server Failover Clustering' e alternatif olarak geliştirilmiş olan Database Mirroring teknolojisinin henüz test amaçlı olmasıdır.

Microsoft, SQL Server 2005 RTM sürümü (9.0.1399)' u piyasaya sürdüğünde, Database Mirroring çözümünün müşterilerince sadece test amaçlı kullanılmasını istemişti. Bunun için de, hata mesajında da belirtildiği gibi Trace Flag 1400 kullanılıyordu.

Database Mirroring, resmen SQL Server 2005 Servis Paketi 1 ile (Trace Flag' siz) kullanılabilir hale geldi.

ÇÖZÜM:
SQL Server 2005 Servis Paketi 1 veya daha üzerini yüklerseniz, Database Mirroring' i yapılandırmaya çalışırken bu hata mesajı ile karşılaşmazsınız.

"CREATE DATABASE failed. Some file names listed could not be created. Check related errors. Cannot create file 'C:\Program Files\Microsoft SQL Server\

HATA MESAJI:
"CREATE DATABASE failed. Some file names listed could not be created. Check related errors. Cannot create file 'C:\Program Files\Microsoft SQL Server\MSSQL.x\MSSQL\DATA\' because it already exists. Change the file path or the file name, and retry the operation. (Microsoft SQL Server, Error: 1802)"

AÇIKLAMA:
Bir veritabanı oluştururken bu hata ile karşılaşabilirsiniz.

Şu senaryoyu düşünün:
Bir veritabanınız var, adı da "xxx" olsun. Varsayılan olarak, eğer özellikle belirtmezseniz, bu veritabanının veri dosyasının ismi "xxx.mdf" kayıt dosyasının ismi de "xxx_log.ldf" olur.

"xxx" isimli veritabanından bir tane daha oluşturmak istiyorsunuz, ama zaten oluşturulmuş olanın da kalmasını istiyorsunuz. Bunun için, eski "xxx" veritabanının adını "xxx_eski" olarak değiştiriyorsunuz. Fakat bu durumda, veritabanının sadece mantıksal ismi değiş oluyor. Yani dosya isimleri gene aynı kalıyor.

Yeni oluşturmaya çalıştığınız veritabanının da adı "xxx" olduğu için, dosya isimleri de aynen eskiden oluşturulmuş olan "xxx" veritabanının dosya isimleriyle aynı oluyor ve bu nedenle de hata alıyorsunuz.

ÇÖZÜM:
Eğer veritabanınızı SQL Server Management Studio yönetim arayüzüyle oluşturmaya çalışıyorsanız, o zaman "New Database" isimli penceresindeki "General" sayfasında bulunan ve veritabanı dosya bilgilerinin düzenlendiği alanlardan biri olan "Logical Name" bilgilerini değiştirebilirsiniz. Böylece fiziksel veritabanı dosyalarının adları da, bu belirlediğiniz mantıksal isimlere göre değişecektir.

Eğer veritabanınızı CREATE DATABASE komutu ile oluşturuyorsanız, o zaman aşağıdaki örnek kodda olduğu gibi NAME değerlerine bir ek etiket ekleyerek oluşturun.

CREATE DATABASE [xxx] ON PRIMARY
(NAME = N'xxx_yeni', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL.x\MSSQL\DATA\xxx_yeni.mdf' , SIZE = 3072KB , FILEGROWTH = 1024KB )
LOG ON
( NAME = N'xxx_yeni_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL.x\MSSQL\DATA\xxx_yeni_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)

Unable to start service SQLAGENT$ on server.

HATA MESAJI:
"Unable to start service SQLAGENT$ on server.

Access denied (ObjectExplorer)"

AÇIKLAMA:
Windows Vista ve Windows Server 2008 işletim sistemleriyle hayatımıza giren yeni bir özellik olan User Account Control güvenlik sistemi nedeniyle türlü türlü yeni sorunlarla karşılaşıyoruz. İşte karşınıza çıkan bu sorunun da nedeni UAC.

Aslında güzel bir sistem ve normalde kullanılmasını tavsiye ederim. İstisnai durumlarda elbette kapatılabilir.

UAC konusu bu yazımın amacı değil bu nedenle bu konuya uzun uzadıya girmeyeceğim. Ama aldığınız bu hata mesajının sorumlusu da UAC' dir.

ÇÖZÜM:
Bu sorunu iki yolla aşabilirsiniz:

1- SQL Server Management Studio uygulamasını doğrudan çalıştırmak yerine, fare ile üzerinde sağ tuşa tıkladıktan sonra "Run as Administrator" seçeneğini seçerek çalıştırın. Çünkü sizin hesabınız bir yönetici hesabı da olsa, UAC açıkken siz talep etmediğiniz sürece Windows Vista size normal kullanıcı muamelesi yapacaktır.

2- UAC' yi kapatın. Ama dediğim gibi, çoğu durum için UAC' nin kapatılmasını tavsiye etmiyorum.

UAC' yi bir çok yolla kapatabilirsiniz, ama en pratiği MSCONFIG (Başlat\Çalıştır = MSCONFIG) uygulamasında bulunan Araçlar isimli sekmede UAC' yi kapatmak için bir seçenek göreceksiniz. Ya da, Denetim Masasındaki Kullanıcı Hesapları' ndan UAC' yi açabilir veya kapatabilirsiniz. Bu işlemin geçerli olabilmesi için bilgisayarınızı kapatıp tekrar açmanız gerektiğini unutmayın.

"Update 'GDR 3068 for SQL Server Database Services 2005 ENU (KB948109)' could not be installed. Error code 1603."

HATA MESAJI:
"Update 'GDR 3068 for SQL Server Database Services 2005 ENU (KB948109)' could not be installed. Error code 1603."

AÇIKLAMA:
Bu hatayı Hotfix_KB948109' u yüklerken alabilirsiniz. Bu yama Windows Update yoluyla yüklenirken de bu hatayla karşılaşabilirsiniz.

ÇÖZÜM:
1. Aşağıda verdiğim yollardaki KEY' leri silin:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.X\Setup\SQLGroup
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.X\Setup\AGTGroup
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.X\Setup\FTSGroup
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.X\Setup\ASGroup

Not: Buradaki "MSSQL.X" ilgili SQL Server Instance' ınızın kodu. Her SQL Server Instance' ı yüklenirken bu Instance' a "MSSQL." biçiminde bir kod atanır.

Aşağıdaki anahtardan, yamayı uygulamak istediğiniz ve bu hata ile karşılaştığınız SQL Server Instance' ınızın yükleme kodunu bulabilirsiniz.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL

2. Bahsi geçen yamayı tekrar yüklemeyi deneyin.

"SQL Server Setup could not connect to the database service for server configuration. The error was: [Microsoft][SQL Native Client]Encryption not supp

HATA MESAJI:
"SQL Server Setup could not connect to the database service for server configuration. The error was: [Microsoft][SQL Native Client]Encryption not supported on the client. Refer to server error logs and setup logs for more information. For details on how to view setup logs, see "How to View Setup Log Files" in SQL Server Books Online."

AÇIKLAMA:
Aslına bakarsanız bu hatanın neyden kaynaklandığını Microsoft bile bilmiyor =) "Hadi canım sen de!" diyenleriniz olabilir... Bir MSFT (Paul Nicholson)' nin MSDN Forumlarında bu sorunun nedenini hâlâ bilmediklerini söylediğini görmüştüm.

ÇÖZÜM:
Sorunu çözmek için, aşağıda verdiğim Regedit kayıtlarını (risk size aittir) Registry' ye aktarmanız (Import) gerekiyor. Bir çok kişinin bu sorunu böyle çözdüğüne şahit oldum.

Yalnız, eğer bu aşağıdaki anahtarlar ve veriler Regedit' inizde zaten varsa, o zaman sorun başka bir şeyden kaynaklanmaktadır ve bu durumda bu çözümü de denemenize gerek yok.



[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0]
"ProtocolsSupported"=hex(7):73,00,6d,00,00,00,74,00,63,00,70,00,00,00,6e,00,70,\
00,00,00,76,00,69,00,61,00,00,00,00,00
"ProtocolOrder"=hex(7):73,00,6d,00,00,00,74,00,63,00,70,00,00,00,6e,00,70,00,\
00,00,00,00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\GeneralFlags]
"NumberOfFlags"=dword:00000002

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\GeneralFlags\Flag1]
"Label"="Force protocol encryption"
"Value"=dword:00000000

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\GeneralFlags\Flag2]
"Label"="Trust Server Certificate"
"Value"=dword:00000000

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\LastConnect]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\np]
"DLLname"="SQLNCLI"
"NumberOfFlags"=dword:00000000
"NumberOfProperties"=dword:00000001
"ProtocolName"="Named Pipes"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\np\Property1]
"Name"="Default Pipe"
"Value"="sql\\query"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\sm]
"DLLname"="SQLNCLI"
"NumberOfFlags"=dword:00000000
"NumberOfProperties"=dword:00000000
"ProtocolName"="Shared Memory"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\tcp]
"DLLname"="SQLNCLI"
"NumberOfFlags"=dword:00000000
"NumberOfProperties"=dword:00000003
"ProtocolName"="TCP/IP"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\tcp\Property1]
"Name"="Default Port"
"Value"=dword:00000599

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\tcp\Property2]
"Name"="KEEPALIVE (in milliseconds)"
"Value"=dword:00007530

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\tcp\Property3]
"Name"="KEEPALIVEINTERVAL (in milliseconds)"
"Value"=dword:000003e8

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\VIA]
"DLLname"="SQLNCLI"
"NumberOfFlags"=dword:00000000
"NumberOfProperties"=dword:00000002
"ProtocolName"="VIA"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\VIA\Property1]
"Name"="Default Server Port"
"Value"="0:1433"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI9.0\VIA\Property2]
"Name"="Default Client NIC"
"Value"="0"

"An installation package for the product Microsoft SQL Server Native Client cannot be found. Try the installation again using a valid copy of the inst

HATA MESAJI:
"An installation package for the product Microsoft SQL Server Native Client cannot be found. Try the installation again using a valid copy of the installation package 'sqlncli.msi'."

AÇIKLAMA:
SQL Server 2005 kurulumunda SQL Native Client yüklenirken böyle bir hata mesajı alabilirsiniz.

Bunun nedeni, daha önceden kalan bir SQL Native Client yüklemesi olabilir ve şimdiki kurduğunuz sürümle çakışabilir; sonucunda da bu hata ile karşılaşırsınız.

Bunun sonucunda da SQL Native Client ve Database Engine bileşenlerinin yüklemeleri başarısızlıkla sonuçlanır.

ÇÖZÜM:
Bu sorundan kurtulmak için Denetim Masasındaki Program Ekle\Kaldır bölümünde bulunan "Microsoft SQL Server 2005 Native Client" isimli uygulamayı kaldırın ve SQL Server 2005 Setup' ı tekrar başlatın.

Bu sefer SQL Native Client' ın yüklenmesinde sorun çıkmamalı ve tabi dolayısıyla da diğer bileşenlerin yüklenmesinde de SQL Native Client' a bağlı sorunlar ortadan kalkmalı.

"The product instance 'Instance_adı' has had update 3033 applied. You cannot install GDR update 3054 overtop update 3033.

HATA MESAJI:
"The product instance 'Instance_adı' has had update 3033 applied. You cannot install GDR update 3054 overtop update 3033.

An update of build equal to or greater than 3159 should be downloaded."

AÇIKLAMA:
Eğer SQL Server 2005 Instance' ınızı CTP Servis Paketi 2 ile yamaladıysanız (9.00.3033.00) ve bu yamadan sonra da SP2 GDR1 Hotfix' ini kurmaya çalışırsanız yukarıdaki hata ile karşılaşırsınız.

Eğer "SP2 GDR2 Hotfix" ini kurmaya çalışırsanız da aşağıdaki hata mesajı ile karşılaşırsınız:
The product instance XXXX has had update 3033 applied. You cannot install GDR update 3159 overtop update 3033. An update of build equal to or greater than 3042 should be downloaded.

ÇÖZÜM:
Öncelikle, üretim sunucularınızda kesinlikle ama kesinlikle CTP, BETA, ALPHA vs. gibi henüz test aşamasında olan ürünleri kullanmanızı önermiyorum. Sonuçta bunlar henüz deneme sürecindeki yazılımlar, sadece test amaçlı kullanılmalıdırlar.

Sorunu çözmek için ise, buraya tıklayarak SQL Server 2005' in Servis Paketi 2' sini indirip kurun.

Bir başka çözüm ise, bu güncellemeyi yaparken Windows Authentication yerine, meselâ "sa" hesabını veya bu hesap gibi "sysadmin" rolüne üye başka bir SQL Login' in kullanılmasıdır.

"SQL Server Setup has encountered the following problem: [Microsoft][SQL Native Client][SQL Server]The certificate cannot be dropped because one or mo

HATA MESAJI:
"SQL Server Setup has encountered the following problem: [Microsoft][SQL Native Client][SQL Server]The certificate cannot be dropped because one or more entities are either signed or encrypted using it.. To continue, correct the problem, and then run SQL Server Setup again."

AÇIKLAMA:
SQL Server 2005 Sürüm Yükseltme (Upgrade) sırasında böyle bir hata mesajıyla karşılaşabilirsiniz.

SQL Server 2005' in hangi sürümünden hangi sürümüne yükselttiğiniz ile alâkalı bir sorun olmadığı için herhangi bir sürümde karşılaşılabilir.

Hatanın nedeni, o anda yükseltme işlemi yapıyor olduğunuz SQL Server 2005 Instance' ında, Certificate, Symmetric Key veya Asymmetric Key bulunmasıdır.

ÇÖZÜM:
Eğer bu nesneleri silerseniz, o zaman yükseltme işlemi sorunsuz olarak tamamlanacaktır.

Fakat bu konuda benim başıma ilginç bir şey gelmişti, onu da sizinle paylaşmak istiyorum.

SQL Server 2005 Standard Edition' dan, SQL Server 2005 Developer Edition' ına yükseltme işlemi yapıyordum ve bu hata ile karşılaştım. Standard Edition' daki bir veritabanımda bu bahsettiğim nesnelerden olduğunu gördüm ve sildim. Ama bu işlemi yükseltme işleminden sonra yapmıştım. Yani yükseltme işlemi gerçekleşmişti bile.

Gelmek istediğim nokta şu, aslında veritabanı motorunun yüseltme işlemi tamamlanıyor ve ardından SQL Server Setup, Standard Edition' daki bu nesneleri Developer Edition için ayarlarken çıkıyor bu sorun. Yani sorun, veritabanı motorunun yükseltilmesiyle alâkalı değil, nesnelerin transferiyle alâkalı bir sorun olsa gerek.

Eğer bu hatayı aldıktan sonra SQL Server 2005 Developer Edition Setup' ını çalıştırıp tekrar aynı SQL Server Instance' ını yükseltmek isterseniz göreceksiniz ki başaramayacaksınız çünkü yükseltmeye çalıştığınız Instance zaten Developer Edition' a yükseltilmiş olacak. Bunu görmek için SELECT @@VERSION komutunu çalıştırabilirsiniz.