MsSQL - Sıkça Sorulan Sorular

ISPGuard

Paylaşım Bizim İşimiz
Yönetici
Bu Başlık Altından Sizlere Daha Önceden Karşılaşılmış Sorunları ve Çözümleri Paylaşacağım.

Soru: SQL Server 2008 hakkında yararlanabileceğim kaynaklar nelerdir?

Cevap: Kitap olarak önerebileceklerim;

SQL Server 2008 R2 - Selçuk Özdemir
SQL Server 2008 R2 ile Veritabanı Programlama - Yaşar Gözüdeli

Soru: SQL Server 2005’ bağlanmaya çalışıyorum fakat "Login failed for user ’username’. The user is not associated with a trusted SQL Server connection. (Microsoft SQL Server, Error: 18452)" hatası alıyorum.

Cevap: Start/Run/reg dosyası çalıştırılır. Bu işlem LoginMode’u mix mode yapacak ve sorun düzelecektir.



Soru: Sorgumu çalıştırdığımda "Divide by zero error encountered" hatası alıyorum.

Cevap: Mantık hatasıdır. Sıfıra bölünememeyi ifade eder. Sorgunuzda yaptığınız işlemi kontrol etmelisiniz.



Soru: SQL Server’a ağdaki diğer bir pc’den bağlanabilmek için nasıl bir yol izlemem gerekiyor?

Cevap: SQL Server Management Studio üzerinde bağlanmak istediğiniz bilgisayara ait IP adresini yazarak, varsa username ve password kısımlarını doğru şekilde girerek bağlanabilirsiniz.



Soru: SQL Server’ paylaşıma açmak için ne yapmam gerekiyor?

Cevap: SQL Server Configuration Manager’da Client Protocols üzerindeki TCP/IP erişim özellikleri "Enable" olmalı. Bunun için TCP/IP protokolü üzerinde sağ tıklayıp özelliklerinden "Default Port: 1433", "Enable: Yes" olarak düzenlenmelidir.



Soru: Sistemde Visual Studio kurulurken SQL Server Express sürümü de yüklendi. Yeniden SQL Server kurmama gerek var mıdır?

Cevap: Visual Studio kurulurken SQL Server Express Edition sürümü de bilgisayarınıza yüklenir. Uygulamalarınız için bundan yararlanabilirsiniz. SQL Server’ın diğer serviceslerine ihtiyacınız yoksa ayrıca bir SQL Server sürümünü kurmanıza gerek yoktur.



Soru: SQL Server’in dil ayarlarını nasıl değiştirebilirim?

Cevap: EXEC sp_configure ’default language’, 22 RECONFIGURE
sorgusunu çalıştırarak yapmak istediğiniz dili seçebilirsiniz. Default olarak kullanılan dili görmek için "select @@Language" sorgusunu çalıştırabilirsiniz.

Soru: Tablodaki date bilgisi Yıl/Ay/Gün formatında kaydediliyor fakat Gün/Ay/Yıl formatında kaydetmek istiyorum ne yapabilirim?

Cevap: "set dateformat DMY; insert into tabloadi" şeklinde düzenleyebilirsiniz.



Soru: SQL Server 2000’deki veritabanı ve prosedürlerimi sorunsuz bir şekilde SQL Server 2008’de çalıştırabilirmiyim?

Cevap: SQL Server’da geriye uyumluluk olduğundan ötürü veritabanınızı taşıyabilir ve sorgularınızı rahatlıkla çalıştırabilirsiniz.



Soru: "An installation package for the product MSXML 6.0 parser (KB933579) cannot be found.Try the installation again using a valid copy of the installation package ’msxml6.msi’." hatası alıyorum.

Cevap: Denetim Masasından > Program Ekle veya Kaldır > MSXML 6.0 Parser dosyasını silip yeniden kurulum yapılırsa sorun düzelecektir.



Soru: Veritabanımın dilini Turkhis_CI_AS olarak değiştirmek istiyorum.

"Error 5030 - Error changing collation The Database could not be exclusively locked to perform the operation. ALTER DATABASE failed. The default collation of database ’DatabaseName’ cannot be set to "Collation Name". (Microsoft SQL Server, Error: 5030)" şeklinde bir hata alıyorum.

Cevap: Aşağıdaki 3 satırı sırasıyla çlıştırmalısınız.

-- Veritabanını "Single User" moda dönüştürür.
ALTER DATABASE veritabaniAdi SET SINGLE_USER WITH ROLLBACK IMMEDIATE

-- Veritabanını yeni dil ailesine dahil ederiz. Eğer Turkhis_CI_AS olmasını istiyorsanız onu yazmalısınız.
ALTER DATABASE veritabaniAdi COLLATE DILAILESIADI

-- Veritabanını tekrardan "Multi User" moda çeviririz.
ALTER DATABASE veritabaniAdi SET MULTI_USER




Soru: Sistemimde Windows XP yüklü, SQL Server 2008 R2 kurulumu esnasında PowerShell ile ilgili hata alıyorum ne yapmam gerekiyor?

Cevap: İşletim sistemine uygun PowerShell sürümünü indirip kurmanız gerekiyor. SQL Server 2008 R2 için PowerShell 1.0 ve üstü kurulu olmalıdır.




Soru: SqlDataSource nesnesi ile SQL Server’a bağlanmak istiyorum nasıl yapabilirim?

Cevap: SqlDataSource nesnesinin özellikler penceresinden "Server Name" alanına "." veya SQL Server ismini yazmalısınız. Daha sonra ilgili veritabanını database seçeneğinden ekleyebilirsiniz.




Soru: SQL Server’da iki farklı database üzerinde A database’indeki a tablosundaki verileri B database’indeki b tablosuna taşıyabilmek için ne yapmam gerekiyor?

Cevap: Data Transformation Services(DTS) işlemleri ile halledebilirsiniz. B database üzerinde Import/Export işlemleri yapılabilir. Aşağıdaki adımları izleyerek yapabilirsiniz.

- Önce B database i üzerinde sağ tıkla "Task" ordanda "Import Data"

- Açılan pencereden Next, gelen kısımda en altta "Database" alanından A database adını seçip, devam et

- Gelen bölüme aktarma yapacağın database adı yani B olacaktır, burada herhangi bir değişiklik yapmadan devam et,

- Devamında işaretli iki seçenek var, ilk baştaki işaretli olacaktır dokunmadan devam et,

- Gelen pencerede "Source" aktaracağın databasedeki tablo isimleri ve "Destination" karşı tablo için kısımlar görülecektir. Burada aktarmak istediğin tablo ya da tabloları seçtiğinde karşısında ekleneceği "Destination" kısımları çıkacaktır. Destination kısmındaki alana mouse ile tıkla, açılan pencereden eklemek istediğin tabloyu seç ve devam et

- Sonrasında next ve finish ile sonlandırılır.

Soru: SQL Server sunucu adını değiştirmek isiyorum nasıl yapabilirim?

Cevap: Aşağıdaki adımları izleyebilirsiniz.

  1. SQL Server Management Studio açın.
  2. Query yani sorgu ekranına şu kodu girip çalıştırın: SELECT @@ServerName
  3. çalıştırdığınızda server adınız çıkacak. Şimdi de server adınızı yazarak şu kodu çalıştırın: sp_dropserver ’EskiServerAdi’
  4. Artık server’ı drop ettik, şimdi yenisini oluşturacağız: sp_addserver ’YeniServerAdi’, local
  5. Yeni serverı da oluşturduk, şimdi SQL Serverımızı restart edelim:
Başlat >> Çalıştır >> cmd yazıp enterlayın.
Komut satırına : "net stop mssqlserver" yazarak enterlayın.
Şimdi aynı şekilde: "net start mssqlserver" yazıp enterlayın.

SQL Server adınız değişmiş olacaktır.
 

ISPGuard

Paylaşım Bizim İşimiz
Yönetici
Soru: SQL Server’da veritabanının Collacion’ı "SQL_Latin1_General_CP1_CI_AS". Bunu Turkish_CI_AS olarak değiştirmek istiyorum. Ancak izin verilmiyor. Çünkü veritabanının içerisinde bazı tablolar dbo.TabloAdi yerine deneme.TabloAdi şeklindeler. Bu deneme.TabloAdi şeklinde olan tabloları dbo.TabloAdi olarak değiştirmem mümkün müdür?

Cevap: Aşağıdaki stored procedure ile mümkün.

USE Database_Adi
EXECUTE sp_changeobjectowner ’deneme.TabloAdi’, ’dbo’




Soru: SQL Server’daki bir tabloyu .txt formatına dönüştürmek istiyorum nasıl yapabilirim?

Cevap: SQL Server’daki tablolarınızı dosya transfer işlemleri ile farklı formatlara dönüştürebileceğiniz gibi bu formattaki dosyalarınızı SQL Server’a aktarabilirsiniz. Bu işlemler SQL Server 2000, 2005’de DTS işlemleri ile yapılırken SQL Server 2008 Business Studio ile Integration Services sayesinde kolayca yapabilirsiniz.

Soru: SQL Server 2000’de veritabanımı yedeklemek istiyorum. Sql server enterprise manager ile db’ye sağ tıklayıp backup’a tıkladığımda veritabanını yedekliyor ama yedeği Server üzerinde bir dizine kaydediyor. Ben bu yedeği doğrudan kendi bilgisayarıma kaydetmek istiyorum nasıl yapabilirim?


Cevap: Yerel Disk üzerindeki (C:\\DizinAdi) bölümünde aşağıdaki kodu Server’daki Query Analyzer’da çalıştırdığınızda kendi bilgisayarınıza bir yedeğini kaydedecektir.

declare @location varchar(120)
set @location = N’C:\\DizinAdi-’+replace(str(year(getdate()))+’-’+str(month(getdate()))+’-’+str(day(getdate())),’ ’, ’’)+’.bak’

BACKUP DATABASE [DBAdi] TO DISK = @location
WITH NOFORMAT, INIT, NAME = N’KO-Full Database Backup’,
SKIP, NOREWIND, NOUNLOAD, STATS = 10

declare @backupSetId as int
select @backupSetId = position from msdb..backupset
where database_name=N’DBAdi’ and backup_set_id=(select max(backup_set_id)
from msdb..backupset where database_name=N’DBAdi’)
if @backupSetId is null
begin raiserror(N’Verify failed.
Backup information for database ’’DBAdi’’ not found.’, 16, 1)
end

RESTORE VERIFYONLY FROM DISK = @location
WITH FILE = @backupSetId, NOUNLOAD, NOREWIND
GO

Soru: SQL Server 2005’de LOGIN oluşturdum ama hala permission hatası alıyorum. Oluşturduğum logine bazı veritabanlarında işlem yapma izinleri vermek istiyorum, ne yapabilirim?


Cevap: SQL Server 2005’de sadece LOGIN oluşturmak yetmez. Bu sadece SQL SERVER’da oturum açmanızı sağlar. SQL Server katmanlı bir güvenlik sistemi kullanır ve her katman kendi kurallar kümesini uygular. Önce veritabanı erişim hakkı için bir veritabanı kullanıcısı oluşturup bunu az önce oluşturduğun LOGIN ile ilişkilendirmelisin. Bunuda database içinde Security düğümüne sağ tıklayarak New user ile yapabilirsin.

Ardından ilgili database üzerinde sağ tıklayıp açılan menüden properties’i seçip karşına çıkan pencereden Permission bölümüne gitmelisin. Ordan ilgili kullanıcı veya rol için altta listenen izinleri atayabilirsin. Bu yaptığın o veritabanındaki tüm nesneler için geçerli olacaktır. Bir veritabanı içindeki her bir nesne içinde ayrı izinler tanımlayabilirsin.

Örneğin a tablosu üzerine sağ tıkla ve Properties’e gir. Buradan Permission bölümüne geç ve Users or Rules bölümünde Add butonuna tıklayarak bir kullanıcı ekle. Ardından bu kullanıcı için yine aşağıdan ilgili izinleri atayabilisin.

Artık bu login ile giriş yapan kullanıcı ilgili izinler dahilinde işlem yapabilecektir. Her kullanıcı için ayrı loginler tanımlamanız gerekir.

Oluşturduğunuz bir login’e başlangıçta sysadmin server rolünü atarsanız o login ile oturum açan kişi sunucu seviyesinden herşeyi yapabilir.

Soru: Kendi bilgisayarımda yazdığım bir stored procedure’i başka bir pc’e nasıl taşıyabilirim?

Cevap: Veritabanını yedeğini (backup) alırsınız ve diğer bilgisayarda yedeği açarsınız veya Redget gibi sql senkronizasyonunu sağlayan programları kullanarak tablolar, kolonlar, sp ler, viewler, trigger ve indexler herşeyiyle eşitleyebilirsiniz.

Soru: SQL Server 2008’de oluşturulmuş tablolarımda bazı değişilikler yapmak istiyorum. Fakat aşağıdaki gibi bir uyarı veriyor. Nasıl düzenltebilirim?

Saving changes is not permitted. The changes you have made require the following tables to be dropped and re-created. You have either made changes to a table that can’t be re-created or enabled the option Prevent saving changes that require the table to be re-created.


Cevap: Bu denetimi kapatıp, sıkıntıdan kurtulmak için aşağıdaki adımları izleyebilirsiniz;

# Tools menüsü altında yer alan Options seçeneğine tıklayın.
# Designers altından Table and Database Designers seçeneğine tıklayın.
# Prevent saving changes that require table re-creation seçeneğinin işaretini kaldırın.

Soru: An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)

Additional Information:
The media family on device ‘the backup file‘ is incorrectly formed. SQL Server cannot process this media family. RESTORE HEADERONLY is terminating abnormally. (Microsoft SQL Server, Error: 3241)
 

ISPGuard

Paylaşım Bizim İşimiz
Yönetici
Cevap: SQL Server’da geriye uyumluluk olmadığı için SQL Server 2008’de oluşturduğunuz bir DB’yi bir alt sürümlere restore etmeye çalıştığınızda veya farklı SQL Server Express sürümleri arasında herhangi birinde oluşturulmuş DB’yi bir başka sürüme restore etmeye çalıştığınızda Express sürümler için Data Snapshot ve Migration özelliği olmadığı için bu hata ile karşılaşırsınız. DB’deki verileri tekrar kullanabilmek için bir önceki soruya verilen cevaptaki script yöntemini kullanabilirsiniz.

Soru: Oluşturduğum bir veritabanında birden fazla dile ait verileri saklamak istiyorum. Ne tür veri tipleri kullanmam gerekir?


Cevap: Uluslararası verinin saklanacağı veritabanındaki veri tipleri Unicode olmayan char, vchar ve text yerine Unicode olan nchar, nvarchar ve nvarchar(max) olarak seçilmelidir. Unicode her yazı karakteri için yazılım ve dil gözetmeksizin bir ve yalnız bir kod bulunduran standart bir kodlama sistemidir. Unicode tüm dillerden tüm karakterleri desteklediğinden farklı karakter setleri için farklı kodlama sistemi kullanılmasına gerek kalmaz.

Soru: SQL Server 2000 veya 2005 sürümlü SQL Server’ı veritabanıları ile SQL Server 2008’e yükseltmek istiyorum, ne yapmalıyım?



Cevap: Eski server’in üstünde direk SQL Server 2008 kurarak upgrade edebilirsiniz. Bu durumda gerekli dosya dönüşüm işlemlerini SQL Server yapar ancak eski sisteme dönme ihtimaliniz varsa, SQL Server 2008’i yeni bir instance olarak kurmanızda fayda vardır.

SQL Server 2000-2005’te aldığınız bir yedeği SQL Server 2008’de restore edebilirsiniz. SQL Server 2000-2005’teki mdf ve ldf dosyalarını deattach edip, SQL Server 2008’e getirip attach edebilirsiniz.


Basit bir Attach-Deattach işlemi için Adım Adım Upgrade şu şekilde olabilir.

1. SQL Server 2008’i kurun.

2. SQL Server 2000-2005’deki veritabanı dosyalarınızı kopyalayabilmek için öncelikle ilgili veritabanı dosyalarının hangi yolda olduğunu öğrenin. Enterprise manager’den veritabanını sağ tıklayıp doyalar sekmesinden bunu görebilirsiniz.

3. İlgili veritabanını deattach edin.

4. Belirlediğiniz veritabanına ait dosyalarınızı SQL Server 2008’in data dosyalarının bulunduğu dizine kopyalayıp yapıştırın.

5. SQL Server 2008’den ilgili dosyaları attach edin.

6. Arkasından yeni veritabanında aşağıdaki düzenlemeleri yapın:

# SQL Server 2000-2005’deki veritabanında geçerli bir uygulama kullanıcısı varsaydı, bunu SQL Server 2008 dosyasında da göreceksiniz. İlgili veritabanı kullanıcısını silin.

# SQL Server 2008’de uygulama erişimi için gerekli sunucu seviyeli login bilgisini tanımlayın.

# Arkasından bu login bilgisinin taşınan veritabanına erişecek kullanıcısını oluşturun ve yeteri kadar hak verin.

# SQL Server 2008’e aktardığınız veritabanının uyumluluk seviyesini Management Studio’dan veritabanını sağ tıklayarak, veritabanı özelliklerinden gerekli seviyeye getirin. Geri dönüş yapma ihtimaliniz varsa 80 uyumlulukta kalabilir ama kesin olarak SQL Server 2008 kullanacaksanız 100 yapmanız daha avantajlı olacaktır.

Soru: Oluşturduğum login ile SQL Server’a bağlanmaya çalışırken aşağıdaki hatayı alıyorum. Ne yapmam gerekir?

"A connection was successfully established with the server, but then an error occurred during the login process.

(provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.) (Microsoft SQL Server, Error: 233)"



Cevap: Bu hatayı almanızın iki nedeni olabilir. Birincisi oluşturduğunuz login’e ait şifreyi hatalı giriyor olabilirsiniz. İkincisi SQL Server’da oluşturulan login’lere ait status ayarı default olarak "disabled" dır. Bu durumda bağlanmaya çalıştığınızda da bu hata ile karşılaşabilirsiniz. Oluşturulan login’i enable yaptığınızda sorun çözülecektir. Bunun için SSMS üzerinde Security>Logins kısmındaki oluşturduğunuz login üzerinde sağ tıklayıp özelliklerine girin. Status seçeneğini "Enabled" olarak işaretleyin.


Soru: Bilgisayarımda hazırladığım bir projeyi başka bilgisayarlara taşıdığımda DB’yi her defasında attach etmek dışında ne yapabilirim?



Cevap: Veritabanına bağlı olarak çalışan bir projeyi başka bilgisayarlarda da sorunsuz çalıştırabilmek için projeye ait veritabanı bağlantısını aşağıdaki gibi yapabilirsiniz. Ayrıca farklı bağlantı türlerini incelemek içinde buradaki bağlantıdan yararlanabilirsiniz.


Server=.\\SQLExpress;AttachDbFilename=|DataDirecto ry|mydbfile.mdf; Database=dbname;Trusted_Connection=Yes;

şeklinde bağlantı sağlayıp, mydbfile.mdf dosyasınıda uygulamaya ait klasörde yer alan \\bin\\Debug klasörüne kopyalarsanız projeniz diğer bilgisayarlarda da çalıştırabilir ve her defasında ilgili db yi farklı bilgisayarlarada attach etmek zorunda kalmazsınız.


Access’de oluşturulan veritabanı içinde aşağıdaki bağlantı türünden yararlanabilirsiniz. Aynı şekilde veritabanına ait .mdb dosyasını projede yer alan \\bin\\Debug dizinine kopyalarsanız projeniz diğer bilgisayarlarda da sorunsuz çalışacaktır.


Provider = Microsoft.JET.OleDb.4.0;Data Source=" + Application.StartupPath + "\\mydbfile.mdb

Soru: Vega yazılıma ait bir yedekleme programı kullanıyorum. Yedekler bir .bat dosyası yardımıyla günlük olarak alınıyor ve dosya ismi olarak o günün tarihi atanıyor. Fakat dosyaya atanan tarih formatını DD.MM.YYYY şeklinde şeklinde değiştirmek istiyorum. Aşağıdaki .bat dosyasını buna göre nasıl düzenlemeliyim?

-----yedekleme başlıyor----

@echo off

------SQL SERVER DURDURULUYOR-----------

NET stop MSSQLSERVER

@ECHO ON -------BAŞLAT-----

xcopy C:\\vegawin\\Data\\. d:\\Yedek\\%date:~0,3%\\. /S /Q /y

@ECHO ON

-----YEDEKLEME BİTTİ--------



Cevap: Klasörü gün.ay.yıl formatında oluşturması için;

%date:~0,3% yerine %date% yazmak gerekiyor. Kopyalama işlemini yapan satır aşağaki gibidir.

xcopy C:\\vegawin\\Data\\. d:\\Yedek\\%date%\\. /S /Q /y

Soru: SQL Server da oluşturduğum bir veritabanını başka bir yere taşımak istiyorum. Fakat izin vermiyor, ne yapabilirim?

Cevap: Hali hazırda kullanılır durumda olan bir veritabanı dosyalarını (.mdf ve .ldf) bulunduğu konumdan doğrudan kopyalama veya keserek taşıma işlemi yapamazsınız. Önce SQL Server da ilgili veritabanını "Detach" etmeniz gerekir. Bunun için de SSMS içerisinde ilgili veritabanı üzerine sağ tık>Tasks>Detach özelliğinden yararlanabilirsiniz.

Soru: Server da SA kullanıcısına ait izinleri nasıl değiştirebiliriz?

Cevap: SA kullanıcısına ait izinleri değiştirmek mümkün değildir. Ancak devre dışı bırakmak veya akif hale getirmek mümkündür.

Bu işlemler için sysadmin yetkisine sahip kullanıcısı ile aşağıdaki komutlardan yararlanabilirsiniz.

/* Disable SA Login */
ALTER LOGIN [sa] DISABLE
GO

/* Enable SA Login */
ALTER LOGIN [sa] ENABLE
GO

Soru: SQL Server’daki bir tabloda bazı veriler text olarak birleştirilerek yan yana tek bir kolonda yer alıyor. Bu verileri nasıl ayırabilirim?

Cevap: Bu işlemi T-SQL de fonksiyon yazarak gerçekleştirebilirsiniz. Örneğin aşağıdaki fonksiyondan yararlanabilirsiniz.

CREATE FUNCTION dbo.MetinParcala
(
@Metin NVARCHAR(MAX),
@Ayrac NVARCHAR(MAX)
)
RETURNS @AyrismisTablo TABLE
(
ID INT IDENTITY(1,1),
AyrilmisMetin NVARCHAR(MAX)
)
AS
BEGIN
DECLARE @Sayac INT
SET @Sayac = 1
DECLARE @Index INT
SET @Index = CHARINDEX(@Ayrac,@Metin)
WHILE(@Index>0)
BEGIN
INSERT INTO @AyrismisTablo(AyrilmisMetin)
SELECT
AyrilmisMetin = LTRIM(RTRIM(SUBSTRING(@Metin, 1, @Index - 1)))
SET @Metin = SUBSTRING(@Metin, @Index + DATALENGTH(@Ayrac) / 2, LEN(@Metin))
SET @Sayac = @Sayac + 1
SET @Index = CHARINDEX(@Ayrac, @Metin)
END

INSERT INTO @AyrismisTablo (AyrilmisMetin)
SELECT AyrilmisMetin = LTRIM(RTRIM(@Metin))
RETURN
END

Aşağıdaki sorguyu örnek alarak fonksiyonu kullanabilirsiniz.

SELECT * FROM dbo.MetinParcala(’Parcalanacak, metin, burada, yer alacak’, ’,’)