7 Nisan 2009 Salı

SSMS: Connect to Server - Sunucu Listesi

Merhaba arkadaşlar,

SQL Server Management Studio 2005 ve 2008' i ilk açtığınızda "Connect to Server" başlıklı bir pencere açılır ve bu pencerede, önceden bağlantı yaptığımız sunuculara ait bilgiler vardır. İşte bu bilgiler, bir dosyada tutulur ve SSMS açılırken bu dosya okunur ve yüklenir. Bazen, "Connect to Server" penceresindeli sunucu listesinde bulunan bazı sunucuları listeden çıkarmak isteyebilirsiniz; fakat bu mümkün değil, en azından henüz benim bildiğim bir yöntem yok.

Ama bu, listeyi sıfırlayamayacağınız anlamına da gelmiyor. Yani ya hep ya hiç... Eğer listedeki tüm sunucu bilgilerini silmek isterseniz, o zaman SSMS versiyonuna göre aşağıdaki yöntemleri kullanın.

Not:
Burada anlattıklarım Microsoft tarafından dokümante edilmiş bilgiler değildir. Henüz herhangi bir zararını görmesem de uyarmak isterim ki, bu dosyalarda yapılacak değişikliklerin beklenmedik sonuçları olabilir.

SQL Server Management Studio 2008 için:

"C:\Users\\AppData\Roaming\Microsoft\Microsoft SQL Server\100\Tools\Shell" klasöründeki "SqlStudio.bin" isimli dosyanın ismini değiştirin. Silmeyin, sadece ismini değiştirin; çünkü herhangi bir nedenden dolayı bu dosyaya veya içindeki bilgilere daha sonra tekrar gereksinim duyabilirsiniz. SSMS 2008, tekrar açıldığında bu dosyayı sıfırdan otomatik olarak oluşturacaktır.

SQL Server Management Studio 2005 için:

"C:\Users\\AppData\Roaming\Microsoft\Microsoft SQL Server\90\Tools\Shell" klasöründeki "mru.dat" dosyası için da aynen "SqlStudio.bin" dosyası için yaptıklarınızı yapıp, SSMS 2005 için aynı sonucu alabilirsiniz.

Not:
Burada verdiğim yollar Windows Vista için geçerlidir, kullandığınız işletim sistemine göre yollar farklılıklar gösterebilir; fakat dosya isimleri aynı olacaktır. Yapacağınız değişiklikleri bu doğrultuda yapmanızı öneririm.


Ekrem Önsoy

Windows XP SP3: MSXML Sorunu

Merhaba arkadaşlar,

Windows XP SP3 yükledikten sonra, SQL Server yüklerken MSXML ile ilgili bazı sorunlarla karşılaşabilirsiniz. Bu konuda çok kişinin sorun yaşadığını gördüğüm için, bu sorunu ve geçici çözümünü kayıt altına aldım. "Geçici" diyorum, çünkü henüz bu konuda Microsoft' tan yayınlanmış bir yama veya FIX yok; bununla birlikte, bildiğim kadarıyla konu üstünde çalışılıyor.

Sorun özetle, Windows takımının, MSXML dosyalarını Windows' un korunan sistem dosyaları kategorisine sokmalarından kaynaklanıyor. Windows XP' ye SP3 yüklendikten sonra MSXML' in versiyonu 6.0 olarak yükseltiliyor, fakat SQL Server 2005 kurmaya çalıştığınızda ise yüklenmeye çalışılan MSXML versiyonu 4.0. Windows XP SP3 yüklendikten sonra MSXML dosyaları da koruma altına alındığı için SQL Server 2005' in yüklenmesi sırasında MSXML ile ilgili sorunlarla karşılaşılıyor.

Bu sorundan kurtulmak için aşağıdaki yöntemleri uygulayabilirsiniz:

- Windows Installer Cleanup Wizard' ı indirin,
- Uygulamayı çalıştırdıktan sonra, listeden MSXML 6' yı bulun ve kaldırın,
- SQL Server 2005 (veya daha üstü bir versiyonu) yüklemeyi tekrar deneyin.

Daha sonra MSXML 6.0' ı Microsoft Download sitesinden indirip tekrar kurmanız iyi olacaktır.


Ekrem Önsoy
HATA MESAJI:
"The CHECK_POLICY and CHECK_EXPIRATION options cannot be turned OFF when MUST_CHANGE is ON."

AÇIKLAMA:
Bir Login ile SQL Server Instance' ınıza giriş yaparken şifrenizin zamanının dolduğu ve değiştirilmesi hakkında bir mesaj alabilirsiniz. Eğer böyle bir uyarı mesajı alıyorsanız, o zaman bu, ilgili Login' in "CHECK_EXPIRATION" özelliğinin etkin olduğu anlamına gelir.

Şifrenizin süresi dolduğunda ise, şifre muhakkak güncellenmelidir. Eğer şifreyi güncellemeden gidip de Login' in özelliklerinden "CHECK_EXPIRATION" özelliğini iptal etmek isterseniz yukarıdaki hata mesajıyla karşılaşırsınız.

ÇÖZÜM:
Öncelikle, ilgili Login' in şifresi değiştirilmelidir. Bu işlemi SSMS arayüzünü veya T-SQL komutlarını kullanarak yapabilirsiniz.

SSMS:
- SSMS' i açın -> Security -> Logins ve ardından ilgili Login' i bulduktan sonra üzerinde farenin sağ tuşuna tıklayın ve Properties penceresini açın.
- Login' in şifresini değiştirin ve "User must change password at next login" seçeneğinin işaretini kaldırın. OK' düğmesine tıklayıp pencereyi kapatın.
- Eğer Password Policy ve Password Expiration kurallarının bu Login için tekrar uygulanmasını istemiyorsanız, Login' in Properties penceresini tekrar açıp ve "Enforce password expiration" seçeneğinin işaretini de artık kaldırabilirsiniz. Bu işlemi daha önce yapamazdık, çünkü öncelikle bir önceki adımın tamamlanması gerekiyor.

T-SQL:
Aşağıdaki komutu kullanarak ilgili Login' in şifresini değiştirin.

ALTER LOGIN [Login_adı] WITH PASSWORD=N'xxx'

Daha sonra aşağıdaki komutu kullanarak CHECK_EXPIRATION ve CHECK_POLICY özelliklerini de kapatabilirsiniz.

ALTER LOGIN [Login_adı] WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
HATA MESAJI:
"Executing the query "ALTER INDEX [index_adı] ON [dbo].[tablo_adı] REORGANIZE WITH ( LOB_COMPACTION = ON ) " failed with the following error: "The index "index_adı" (partition 1) on table "tablo_adı" cannot be reorganized because page level locking is disabled.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly."

AÇIKLAMA:
Bir veritabanındaki Index' ler için Index Reorganization işlemi yaptığınızda böyle bir hata mesajıyla karşılaşabilirsiniz.

ÇÖZÜM:
Bu hatayı almanızın nedeni, ilgili Index' in ALLOW_PAGE_LOCKS özelliğinin kapalı olmasıdır.

Veritabanınızda bulunan tüm Index' lerin hangilerinin ALLOW_PAGE_LOCKS özelliğinin kapalı olup olmadığını görmek için şu sorguyu çalıştırabilirsiniz:

SELECT A.Name AS InName,ob.Name AS DBName FROM sys.indexes A LEFT OUTER JOIN sys.objects ob ON ob.object_id = A.object_id WHERE ALLOW_PAGE_LOCKS = 0 AND ob.type = 'U'

Bir Index' in ALLOW_PAGE_LOCKS özelliğini etkinleştirmeyi SSMS arayüzünden de yapabilirsiniz, T-SQL ile de:

- SSMS: İlgili tablodaki Index üzerinde farenin sağ tuşuna tıklayın, açılan menüden "Properties" öğesini seçin ve açılan penceredeki Options bölümünde bulunan "Use page locks when accessing the index" seçeneğini işaretleyip OK düğmesine tıklayarak Index Properties penceresini kapatın.

- T-SQL: İlgili Index' a ait bilgileri kullanarak aşağıdaki komutu çalıştırın:
ALTER INDEX ON SET (ALLOW_PAGE_LOCKS = ON)

"Cannot drop the database 'veritabanı_adı' because it is being used for replication. (Microsoft SQL Server, Error: 3724)"

HATA MESAJI:
"Cannot drop the database 'veritabanı_adı' because it is being used for replication. (Microsoft SQL Server, Error: 3724)"

AÇIKLAMA:
Bir veritabanını silmek istediğinizde böyle bir hata mesajıyla karşılaşabilirsiniz.

ÇÖZÜM:
Bu hata mesajını alıyorsanız öncelikle bu veritabanının herhangi bir Replication topolojisiyle ilişkisi olmadığından emin olun. Bu veritabanıyla ilgili herhangi bir Publication olmadığını da kontrol edin.

Eğer yine de bu hata mesajını alıyorsanız, o zaman tahminimce bu, zaten Replication' da kullanılan bir veritabanının örneği\kopyasıdır ve muhtemelen BACKUP\RESTORE ile bir SQL Server Instance' ından diğerine taşınmıştır.

Böyle bir durumda, veritabanının içinde bulunan Replication ile ilgili ayarları temizlemek için aşağıdaki Stored Procedure' ü çalıştırabilirsiniz:

sp_removedbreplication

Bu komut hakkında daha fazla bilgi için: http://msdn.microsoft.com/en-us/library/ms188734.aspx

"Invalid zero-length device name. Reissue the BACKUP statement with a valid device name. [SQLSTATE 42000] (Error 3044) BACKUP LOG is terminating ab

HATA MESAJI:
"Invalid zero-length device name. Reissue the BACKUP statement with a valid device name. [SQLSTATE 42000] (Error 3044) BACKUP LOG is terminating abnormally. [SQLSTATE 42000] (Error 3013). The step failed."

AÇIKLAMA:
Yedek alırken böyle bir hata ile karşılaşabilirsiniz.

ÇÖZÜM:
Eğer bu hata ile karşılaştıysanız, yedek dosyası için bir dosya adı belirttiğinizden emin olun.

Örneğin, eğer aşağıdaki gibi bir komut çalıştırırsanız bu hatayı alırsınız:

BACKUP DATABASE AdventureWorks to DISK = N''

"BackupDiskFile::CreateMedia: Backup device 'Z:\xxx.bak' failed to create. Operating system error 5(error not found)."

HATA MESAJI:
"BackupDiskFile::CreateMedia: Backup device 'Z:\xxx.bak' failed to create. Operating system error 5(error not found)."

AÇIKLAMA:
Yedek almaya çalışırken böyle bir hata mesajı ile karşılaşabilirsiniz.

ÇÖZÜM:
Yukarıda belirtilen hata mesajına göre gidersek, bu hatayı almanızın nedeni, SQL Server servisiniz için kullandığınız hesabın Z: sürücüsünde gerekli güvenlik haklarına sahip olmamasıdır.

Bu hatanın oluşmasını engellemek için, Bilgisayarım' dan Z: sürücüsünün özelliklerine gidin ve Güvenlik (Security) sekmesinde, SQL Server için kullandığınız hesabı (eğer listede yoksa) listeye ekleyin ve bu hesabın bu sürücüde Yazma (Write) hakkı olduğundan emin olun.

"A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible

HATA MESAJI:
"A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server) (Microsoft SQL Server, Error: 2)"

AÇIKLAMA:
SQL Server Instance' ınıza bağlanırken böyle bir hata mesajıyla karşılaşabilirsiniz.

ÇÖZÜM:
Eğer bu hata mesajını alıyorsanız, belirttiğiniz SQL Server adı doğrudur; fakat bağlanılmaya çalışılan SQL Server servisi çalışmıyordur.

SQL Server servislerinin çalışırlığını kontrol etmek için SQL Server Configuration Manager veya Services MMC' sini (Başlat\Çalıştır = services.msc ENTER) kullanabilirsiniz.

"A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessi

HATA MESAJI:
"A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)"

AÇIKLAMA:
SQL Server Instance' ınıza bağlanırken böyle bir hata mesajıyla karşılaşabilirsiniz.

ÇÖZÜM:
Bu hata mesajını görmenizin nedeni, büyük ihtimalle SQL Server Instance adını yanlış belirtmenizden kaynaklanıyordur.

SQL Server' da temel olarak iki Instance tipi vardır, bunlardan biri Default Instance, diğeri ise Named Instance' tır.

Default Instance, bir sistemde sadece bir kere kurulabilir ve bilgisayar adından ibarettir. Örneğin, benim bilgisayarımın adı EKREM-PC olsun, eğer ben bu bilgisayara kuracağım SQL Server Instance' ını bir Default Instance olarak kurarsam, o zaman benim SQL Server Instance' ımın adı da bilgisayar adı gibi EKREM-PC olacaktır. Connection String' imdeki SERVER veya DATA SOURCE olarak da "EKREM-PC" adını kullanmam gerekir.

Named Instance ise bir veya birden fazla kurulabilir. Named Instance, \ biçimindedir. Örnek: "EKREM-PC\SQLExpress". Buradaki "EKREM-PC" benim bilgisayarımın adı, "SQLExpress" ise SQL Server kurulumu esnasında SQL Server Instance' ıma verdiğim isimdir. Connection String' imde de SERVER veya DATA SOURCE olarak "EKREM-PC\SQLExpress" adını kullanmam gerekir.

Eğer SQL Server' a gerek üçüncü parti bir uygulama gerekse SQL Server Management Studio ile bağlanırken Server adı yanlış belirtilirse bu hata ile karşılaşırsınız.

"The transaction log for database 'veritabanı_adı' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column

HATA MESAJI:
"The transaction log for database 'veritabanı_adı' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases (Microsoft SQL Server, Error: 9002)"

AÇIKLAMA:
Bir veritabanında, kayıt dosyasına işlenecek bir işlem yaparken (yeni bir Index oluşturma, Index Rebuild vb.) böyle bir hata mesajıyla karşılaşabilirsiniz.

Hata size kısaca, Transaction Log dosyasında yeterince yer kalmadığını söylüyor.

ÇÖZÜM:
Sorunu çözmek için, ilgili veritabanının Transaction Log dosyasında, yapılacak işlem için yeterince boş yer olduğundan emin olun.

Transaction Log dosyalarınızda ne kadar boş yer kaldığını aşağıdaki komut ile öğrenebilirsiniz.

DBCC SQLPERF(logspace)

Transaction Log dosyanızı boşaltmak için daha fazla bilgi edinmek istiyorsanız http://www.ekremonsoy.net/makaleler/sql/tlog_buyumesi/tlog_buyumesi.aspx.

"String or binary data would be truncated."

HATA MESAJI:
"String or binary data would be truncated."

AÇIKLAMA:
Bir tablonuzda güncelleme veya yeni kayıt ekleme işlemi yaparken böyle bir hata ile karşılaşabilirsiniz.

ÇÖZÜM:
Bu hata ile, bir alanı güncellemeye çalışırken veya bir tabloya yeni bir kayıt eklerken bu hatayı almanızın sebebi, alan genişliği az olan bir alana daha uzun bir genişlikte veri yazmaya çalışmanızdır.

Örneğin, NVARCHAR(10) veritipiyle tanımlanmış bir alana aşağıdaki şekilde veri güncellemeye çalışırsanız bu hatayı alırsınız:

UPDATE tabloX SET alanX = 'Ekrem Önsoy' WHERE alanNO = sayiX