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.

"Database 'veritabani_adi' is in warm standby. A warm-standby database is read-only. ALTER DATABASE statement failed. (Microsoft SQL Server, Error: 50

HATA MESAJI:
"Database 'veritabani_adi' is in warm standby. A warm-standby database is read-only. ALTER DATABASE statement failed. (Microsoft SQL Server, Error: 5063)"

AÇIKLAMA:
Veritabanınızın READ-ONLY iken, bunu tekrar yazılıp okunabilir bir duruma sokmak için veritabanı özelliklerinden (Database Properties) READ-ONLY' nin değerini "False" yapmak istediğinizde bu hatayı alabilirsiniz.

ÇÖZÜM:
Veritabanınızı Warm Standby durumundan çıkarmak için aşağıdaki kodu kullanabilirsiniz:

RESTORE DATABASE veritabani_adi WITH RECOVERY

"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: 28 - Server doesn't support requested protocol) (Microsoft SQL Server, Error: -1)"

AÇIKLAMA:
Uzaktan SQL Server sunucunuza TCP/IP protokolünü kullanarak bağlanmaya çalıştığınızda bu hata ile karşılaşabilirsiniz.

ÇÖZÜM:
Bu hatanın, TCP/IP protokolünün yanlış yapılandırılmasından kaynaklandığını gördüm. TCP/IP protokolünün yapılandırması hakkında daha fazla şey öğrenmek için buraya tıklayarak SQL Server 2005: Uzaktan Bağlantı isimli makalemi okuyabilirsiniz.

"Class not registered"

HATA MESAJI:
"Class not registered"

AÇIKLAMA:
SQL Server 2005' te, Alma\Verme (Import\Export) Sihirbazını kullanmak istediğinizde bu hata ile karşılaşabilirsiniz.

Bu arada, bu hatanın görüldüğü SQL Server 2005 Instance' ına ve Yönetim Araçlarına (SSMS dahil) SP2 uygulanmıştı.

Hataya dair diğer mesajlar:

This wizard will close because it encountered the following error:
(Microsoft SQL Server)

Class not registered

------------------------------
Program Location:

at
Microsoft.SqlServer.Dts.Runtime.Wrapper.ApplicationClass.get_DBProviderInfos()
at
Microsoft.SqlServer.Dts.DtsWizard.DTSWizard.GetDtsDbProviderInfos(WizardInputs
wizardInputs)
at
Microsoft.SqlServer.Dts.DtsWizard.DataSourceCombo.PopulateProviders(Boolean
fSources, WizardInputs wizardInputs)
at
Microsoft.SqlServer.Dts.DtsWizard.Step1.OnInitializePage(EventArgs e)
at Microsoft.SqlServer.Management.UI.WizardPage.RaiseEnterPage()
at Microsoft.SqlServer.Management.UI.WizardForm.NextPage(WizardPage
nextPage)
at Microsoft.SqlServer.Management.UI.WizardForm.Next_Click(Object
sender, EventArgs e)

ÇÖZÜM:
Bu sorunun yaşandığı sistemde, "C:\Program Files\Common Files\System\Ole DB" yolundaki "oledb32.dll" isimli dosya kayıt edilmemişti.

Bu da, "MDAC Utility: Component Checker" isimli uygulama ile tespit edilmişti. Bu uygulamayı indirmek için buraya tıklayın.

Sorunu gidermek için "oledb32.dll" isimli dosya kayıt ettirilmiş ve sorun giderilmişti.

Bir kütüphane (DLL) dosyasını kaydetmek için şu yöntemi kullanabilirsiniz:
- Başlat
- Çalıştır
- regsvr32 (Örnek: regsvr32 C:\Program Files\Common Files\System\Ole DB\oledb32.dll)

SQL Server 2005: Uzaktan Bağlantı

Merhabalar,


Bir SQL Server Instance' ına uzaktan bağlanma konusunda gerek forumlardan gerekse habergruplarından çok soru geliyor. En güzeli bu konuda bir yazı yazmak dedim ve bu makaleyi klavyeye(!) (kaleme?) aldım.

Bir SQL Server Instance' ına uzaktan bağlanabilmeniz için, kurulu olan SQL Server Instance' ının sürüm (Edition) bilgisi, SQL Server Instance' ının üzerinde kurulu olduğu İşletim Sistemini bilgisi öncelikle dikkate almanız gereken bilgilerdir.

Peki neden? Çünkü, meselâ SQL Server 2005' in Express Edition ve Developer Edition' larında, uzaktan bağlantı için kullanılabilecek TCP/IP ve Named Pipes protokolleri kapalıdır. Bu protokoller konusunda daha fazla bilgi almak için Bağlantı Protokolleri isimli yazımı okuyabilirsiniz.

Windows XP SP2 ve Windows' un daha sonraki sürümlerinde ise Windows Güvenlik Duvarı vardır ve bu uygulama etkin olduğunda SQL Server 2005 Instance' ınıza uzaktan erişimi engeller. Çünkü varsayılan olarak SQL Server' ın kullandığı portlar Windows Güvenlik Duvarında açık değildir.

Uzaktan Bağlantı için Yapılması Gerekenler
1 - SQL Server Instance' ınızın ilgili protokolünün yapılandırılması,
2 - Eğer varsa ve etkinse, Windows Güvenlik Duvarının yapılandırılması
3 - SQL Server' ınıza bağlanabilmeniz için kullanacağınız Login.

1- SQL Server Protokollerinin Yapılandırılması:
SQL Server 2005 Instance' ınız için hangi protokolü kullanacağınızı belirledikten sonra, bu protokolün yapılandırmasını gerçekleştirirsiniz. SQL Server protokollerinin yapılandırılması işlemleri için SQL Server 2005 ile birlikte gelen SQL Server Configuration Manager' ı kullanabilirsiniz. (Başlat\Programlar\Microsoft SQL Server 2005\Configuration Tools) Konuya örnek olması için aşağıda TCP/IP protokolünün nasıl yapılandırılabileceğini anlatacağım.

TCP/IP Yapılandırması Örneği:
SQL Server 2005 Instance' ınıza uzaktan yapılacak bağlantılarda kullanılacak TCP/IP protokolünü yapılandırmak için SQL Server Configuration Manager' ı başlatın.

Daha sonra, Şekil-1' de de gösterdiğim gibi SQL Server 2005 Network Configuration düğümü altından uzaktan bağlantı kurulmasını istediğiniz SQL Server 2005 Instance' ınızı seçin. Benim örneğimde bu, TEST2 Instance' ı olacak.

Şekil-1


TCP/IP protokolünü etkinleştirmek veya etkin olduğundan emin olmak için, Şekil-1' de de gösterildiği gibi Protocol Name alanındaki TCP/IP protokolünün Status değerine bakabilirsiniz. "Enabled" etkin olduğu anlamına gelir, "Disabled" ise etkin değil demektir. Bu değeri değiştirmek için TCP/IP protokolünün üzerinde fare ile çift tıklayın veya TCP/IP protokolünün üzerinde farenin sağ tuşuna tıklayarak, açılan menüden "Properties" seçeneğine tıklayarak "TCP/IP Properties" penceresini açın.

Şekil-1' de gösterildiği gibi "TCP/IP Properties" penceresi açılacaktır. TCP/IP protokolünü etkinleştirmek için, "TCP/IP Properties" penceresindeki "Protocol" isimli sekmede bulunan "Enabled" etiketinin karşısındaki aşağı açılır listeden "Yes" değerini seçin.

"Protocol" sekmesindeki "Listen All" seçeneği önemli bir seçenek bu nedenle buna da değinmek istiyorum. "Listen All", bilgisayara bağlı tüm Ağ Kartlarının (Örn:Ethernet) IP adreslerinin SQL Server tarafından dinlenip dinlenmeyeceğini belirler. Eğer bu seçeneğin değeri "No" yapılırsa, biraz sonra da değineceğim gibi "IP Addresses" sekmesindeki her IP adresini tek tek yapılandırmanız gerekir ve gene aynı sekmede bulunan "IPAll" seçeneklerinin herhangi bir geçerliliği kalmaz. Eğer değeri "Yes" yaparsanız, o zaman gene "IP Addresses" sekmesindeki "IPAll" seçenekleri etkinleşir ve diğer tüm IP adreslerine uygulanır. "Listen All" u etkinleştirdikten sonra "IPAll" seçeneğindeki ayarların, diğer ayarları bastıracağı unutmayın, yoksa ileriki paragraflarda aklınız karışabilir.

TCP/IP protokolünün IP adresi veya Port ayarlarını yapılandırmak için, gene "TCP/IP Properties" penceresinde bulunan "IP Addresses" isimli sekmeye tıklayın. (Bakınız: Şekil-2)

Şekil-2


Bu listede her Ağ Adaptörünüz için bir IP ayar bölümü listelenecektir.

Hangisinin etkinleştirilmesini istiyorsanız, onun "Active" ve "Enabled" ayarlarının karşısındaki değerleri "Yes" durumuna getirin. "Active", o IP adresinin dinleneceğini belirtir. "Enabled" ise o IP adresinin kullanılıp kullanılmayacağını. "IP Address" bölümde ise IPv4 veya IPv6 değeri yer alır. Eğer "TCP Dynamic Ports" etiketinin değeri "0" ise, bunun anlamı bu IP adresi için kullanılacak portun dinamik bir şekilde belirleneceğidir. Bu durumda SQL Server, bu IP adresi için müsait olan bir port numarası atayacaktır.

Meselâ Şekil-2' deki örnekte, TEST2 SQL Server Instance' ı, Dinamik Port olarak atanan 51495 portunun tüm IP' ler tarafından dinlenilmesi için yapılandırılmış. (Bu örnekte, "Protocol" sekmesindeki "Listen All" değerinin "Yes" olduğunu Şekil-1' den anımsayın, aksi takdirde IPAll değerlerinin bir geçerliği olmadığını daha önceki paragraflarımdan hatırlıyor olmalısınız.) Eğer tüm IP' lerin durağan bir IP kullanmasını isteseydik, o zaman "TCP Dynamic Ports" un değerini boş bırakıp, TCP Port' un değerine, kullanılmasını istediğimiz IP numarasını yazacaktık. Bu amaçla, 65535' e kadar müsait bir port numarası seçebilirsiniz.

Şimdi aklınıza şu da takılıyor olabilir, "biz dinamik port kullanacağımız zaman TCP Dynamic Port' s 0 yazıyoruz, nasıl oluyor da orada şimdi 51495 yazıyor?" Çünkü SQL Server bu IP' ye bir dinamik IP atadığı zaman, 0 yerine bu dinamik IP' yi görüyorsunuz.

Şekil-2' de gördüğünüz gibi 192.168.2.2 numaralı IP için iki tane port numarası kullanılmış. Eğer bir IP' nin birden çok port kullanmasını istiyorsanız, o zaman birden çok Port numarasını virgüllerle ayırarak yazabilirsiniz. Bu IP' ye Port numaraları yazılmış, ama peki IPAll' da da dinamik port (51495) kullanıyoruz? Hangisi geçerli olacak? Hemen bir kaç paragraf önceki yazımdan da hatırladığınızı varsayıyorum! Neydi? Eğer "Protocol" sekmesindeki "Listen All" un değeri "Yes" ise, o zaman IPAll' da yazan değerler, diğer değerleri bastırırdı. Yani bu durumda, eğer "Listen All" un değeri "No" olsaydı, 192.168.2.2 numaralı IP, 51495 numaralı dinamik portu değil, 16666 ve 46123 numaralı statik portları kullanacaktı. Bu kadar örnekten sonra bu kavramların oturtuğunu varsayıyorum.

SQL Server Instance' ınıza uzaktan bağlanabilmek için size durağan (Static) portları kullanmanızı tavsiye ederim. Bu nedenle, Şekil-2 deki "TCP/IP Properties" penceresindeki ilgili IP' nin "TCP Dynamic Ports" etiketinin değerini boş bırakmanızı tavsiye ederim. Yani orada ne "0" ne de başka bir değer yazmasın ve gene aynı penceredeki "TCP Port" etiketinin değerine müsait bir port numarası girin ve bu ayarların geçerli olabilmesi için, protokolün ait olduğu SQL Server Instance' ının SQL Server servisini durdurup tekrar başlatın.

Peki SQL Server Instance' ınızın hangi port numarasını dinlediğini nasıl teyit edeceksiniz? Bunun için Komut İstemcisi (Command Prompt) u kullanabilirsiniz. Komut İstemcisini çalıştırın (Başlat\Çalıştır ve tırnak içindeki komutu yazın "cmd" ve çalıştırın.)

O anki TCP/IP bağlantılarını ve protokol istatistiklerini görüntüleyebilmemiz için Komut İstemcisinde Netstat komutunu kullanabiliriz. Hangi Protokolün ve IP numarasının hangi portu kullandığını ve durumunu görüntülemek için "Netstat -a" komutunu kullanacağız. Bu komut hakkında daha fazla bilgi alabilmek için Komut İstemcisindeyken "Netstat -?" komutunu çalıştırabilirsiniz.

Aşağıdaki Şekil-3' te "Netstat -a" komutunu çalıştırdıktan sonra nasıl bir görüntüyle karşılaşacağınızı görebilirsiniz.


Şekil-3


Beyaz çerçeve ile işaretlediğim aralıkta, 192.168.2.2 IP numaralı SQL Server sunucumuzun 16666 ve 46123 numaralı portları dinlediğini (LISTENING) görebilirsiniz.


2 - Windows Güvenlik Duvarının Yapılandırılması:
Bu konuda Microsoft tarafından yazılmış bir makale zaten mevcut için benim bu konuda daha fazla bir şey yazmama gerek kalmıyor. Buraya tıklayarak bahsini ettiğim makaleye ulaşabilirsiniz.

Ahh ama bir şey de eklemeden edemeyeceğim! Bazı durumlarda bu işlemleri yapmanın da yetersiz kaldığını gördüm. Meselâ bir müşterimiz tüm bunları yaptığı halde gene de uzaktaki SQL Server sunucusuna bağlanamıyordu. Nedeni ise, modemindeki Güvenlik Duvarı ve kısıtlamalardı. Yani, modeminizdeki yapılandırmayı da gözden geçirmenizde yarar var. Aksi takdirde günlerce uğraşır sorunu çözemezsiniz...

3- Login:
Çoğunuzun bildiği gibi SQL Server' da Authentication Mode (Yetkilendirme Modu) olarak iki adet seçeneğimiz bulunuyor. Birisi Windows Authentication, diğeri ise SQL Authentication (veya Mixed Authentication).

Windows Authentication' ı sadece güvenilir ortamlarda kullanabilirsiniz. Nedir güvenilir ortamlar? Meselâ aynı Domain' in parçasıysanız güvenik ilişkisi olan bir ortamdasınızdır. Eğer yetkileriniz izin veriyosa, kendi Domain hesabınızla aynı Domain' in parçası olan diğer kaynakları kullanabilirsiniz. Bizim konumuzla alâkalı bir örnek vermek gerekirse, SQL Server Instance' ınıza bir Domain Güvenlik Grubunun bir üyesi olarak veya bir Domain hesabıyla bağlanabilirsiniz. SQL Server için herhangi bir şifre girmenize de gerek kalmaz. Mümkün olan her senaryoda bu Authentication Mode' unu kullanmanızı tavsiye ederim. SQL Authentication' dan çok daha güvenlidir. Zaten Microsoft' da bunu tavsiye eder ve dokümanlarında da SQL Authentication' ı sadece geriye destek için hâlâ barındırdıklarını söylüyorlar.

SQL Login deyince benim aklıma hemen "sa" geliyor. Çünkü kullanıcıların yaptığı bu yanlışı o kadar çok gördüm ki...

Arkadaşlar! Lütfen her şey için "sa" hesabını kullanmayın! KULLANMAAAAYIN! Çünkü "sa" hesabı "sysadmin" sabit sunucu rolü üyesi (ve bu rolden çıkarılamaz) bir hesaptır.

SQL Server 2005 Instance' ınızı kurarken Authentication Mode olarak eğer Windows Authentication' ı seçmiş iseniz, o zaman "sa" hesabı otomatik olarak kullanılamaz olacaktır. Tabi ta ki siz onu etkinleştirip, Authentication Mode' unu da Mixed Authentication yapmadığınız sürece. Eğer SQL Server 2005 Setup' taki Authentication Mode bölümünde Mixed Authentication' ı işaretlediyseniz, o zaman "sa" hesabı kullanılabilir olacaktır.

"sa" hesabını neden kullanmamalıyız konusuna SQL Server 2008: Güvenlik ile ilgili değişiklikler isimli yazımda deyinmiştim. Tekrar tekrar aynı şeyleri yazmanın gereği yok, o yüzden ilgilenenler, o yazımdaki "sa" hesabıyla ilgili yazdıklarımı okuyabilirler.

Eğer bağlanacağınız SQL Server Instance' ı ile güvenilir bir ortamda değilseniz, o zaman SQL Authentication yoluyla bir SQL Login kullanarak bağlanabilirsiniz.

Login hakları ise bu konunun ötesinde bir konu.



Ekrem Önsoy