30 Eylül 2010 Perşembe

\. File attachment or query results size exceeds allowable value of 1000000 bytes. [SQLSTATE 42000] (Error 22050). The step failed.

HATA:
\. File attachment or query results size exceeds allowable value of 1000000 bytes. [SQLSTATE 42000] (Error 22050). The step failed.

AÇIKLAMA:
Örneğin bir sorgu sonucunu Database Mail'de tanımlı bir posta hesabıyla göndermeye çalışırken bu hatayı alabilirsiniz.

Aslında bu, Database Mail'deki bir parametre ayarından kaynaklanıyor ve bir kontrollü bir hatadır eğer buna hata denilebilirse.

ÇÖZÜM:
Bu ayarda düzenleme yapmak için ilgili SQL Server Instance'ına SQL Server Management Studio'dan bağlanın ve aşağıdaki yolu takip edin:

-> Object Explorer
-> Management
-> Database Mail Properties
-> View or change system parameters
-> Maximum File Size (Bytes)

SQL Server 2008 SP2 çıktı!

SQL Server 2008 SP2 bugün çıktı, ayrıntılar için aşağıdaki bağlantıları kullanabilirsiniz:

SQL Server 2008 SP2: http://go.microsoft.com/fwlink/?LinkId=196550
SQL Server 2008 SP2 Express : http://go.microsoft.com/fwlink/?LinkId=196551
SQL Server 2008 SP2 Feature Packs : http://go.microsoft.com/fwlink/?LinkId=202815

User 'dbo' could not execute stored procedure 'master.dbo.sp_enable_sql_debug' on SQL Server

HATA:
User 'dbo' could not execute stored procedure 'master.dbo.sp_enable_sql_debug' on SQL Server

AÇIKLAMA:
SQL Server 2008'de bir Stored Procedure'ı Debug etmeye çalışırsanız bu hata ile karşılaşabilirsiniz.

ÇÖZÜM:
SQL Server 2008'de Stored Procedure'leri Debug etmek için "sysadmin" Server Fixed Role'ünün üyesi olmanız gerekmektedir.

29 Eylül 2010 Çarşamba

A system assertion check has failed. Check the SQL Server error log for details. Typically, an assertion failure is caused by a software bug or data c

HATA:
A system assertion check has failed. Check the SQL Server error log for details. Typically, an assertion failure is caused by a software bug or data corruption. To check for database corruption, consider running DBCC CHECKDB. If you agreed to send dumps to Microsoft during setup, a mini dump will be sent to Microsoft. An update might be available from Microsoft in the latest Service Pack or in a QFE from Technical Support.

AÇIKLAMA:
Ben bu hata ile, bir kullanıcının üretim sunucularımızdan bir tanesine aşağıdaki gibi bir sorgu gönderdiğinde karşılaştım:

SELECT TOP 100 * FROM . WHERE IN (...)

Sorgudaki IN içerisinde o kadar çok değer vardı ki, soruna neden olan buydu.

Bu sorguya ise Dump kayıt dosyalarından ulaştım. Dump dosyasının nerede olduğunu Dump mesajlarının da bulunduğu SQL Error Log'da bulabilirsiniz.

ÇÖZÜM:
Böyle durumlarda kullanıcının IN yerine Temp Tablo veya Table Variable kullanması gerekiyordu.

23 Eylül 2010 Perşembe

Msg 14262, Level 16, State 1, Procedure sp_verify_proxy_identifiers, Line 51 The specified @proxy_name ('xxxKullanicisi') does not exist.

HATA:
Msg 14262, Level 16, State 1, Procedure sp_verify_proxy_identifiers, Line 51
The specified @proxy_name ('xxxKullanicisi') does not exist.

AÇIKLAMA:
Bu hatayı ben, bir Job oluşturmaya çalışırken aldım. Job Owner olarak "xxxKullanicisi" isimli kullanıcıyı kullanmıştım.

ÇÖZÜM:
Sorun, aslında hata mesajında da belirtildiği gibi "xxxKullanicisi" isimli bir Proxy'nin bulunmamasıydı. Eğer siz de böyle bir sorun yaşıyorsanız, öncelikle bu Proxy'yi oluşturmanız gerekiyor.

22 Eylül 2010 Çarşamba

Msg 515, Level 16, State 2, Procedure sp_validate_user, Line 19 Cannot insert the value NULL into column 'permission path', table '@temp'; column does

HATA:
Msg 515, Level 16, State 2, Procedure sp_validate_user, Line 19
Cannot insert the value NULL into column 'permission path', table '@temp'; column does not allow nulls. INSERT fails.
The statement has been terminated.
Msg 14607, Level 16, State 1, Procedure sp_send_dbmail, Line 136
profile name is not valid

AÇIKLAMA:
Ben bu hata ile, ilgili sunucudan aşağıdaki koda benzer bir kod ile Database Mail vasıtasıyla eposta göndermeye çalışırken karşılaştım:

Örnek Kod:
EXECUTE msdb.dbo.sp_send_dbmail
@profile_name = 'SMTP'
,@recipients = 'ekrem.onsoy@test.com'
,@body = 'test_mesaj'
,@subject = 'test_konu'


Bahsi geçen SQL Server Instance'ında iki tane Database Mail Profile ve Account'u mevcuttu.

ÇÖZÜM:
Sorun, iki Database Mail Profile'ının da Public olmamasıydı. Yukarıdaki örnekte de kullanılan "SMTP" isimli Database Mail Profile'ı da Public değildi.

Ya ilgili Database Mail Profile'ını Public olarak ayarlayın ya da ilgili Login'i Private Database Mail Profile'ını kullanabilecek şekilde ayarlayın.

Bu ayarları da ister T-SQL ile isterseniz de SQL Server Management Studio aracılığıyla yapabilirsiniz. Değişikliği SSMS'ten yapmak için: Object Explorer->Management->Database Mail->Manage Profile Security->Public Profiles\Private Profiles.

21 Eylül 2010 Salı

Msg 15404, Level 16, State 19, Procedure xp_logininfo, Line 62 Could not obtain information about Windows NT group/user 'DOMAIN\USER', error code 0x5

HATA:
Msg 15404, Level 16, State 19, Procedure xp_logininfo, Line 62 Could not obtain information about Windows NT group/user 'DOMAIN\USER', error code 0x5

AÇIKLAMA:
Ben bu hata ile ilk kez xp_logininfo 'DOMAIN\USER' komutunu çalıştırdığımızda karşılaştık. Fakat bu daha genel bir sorundu, sadece bu komut ile ilgili değil. Örneğin EXECUTE AS LOGIN = 'DOMAIN\USER' komutunu çalıştırdığımızda da bu hata ile karşılaşıyorduk.

ÇÖZÜM:
Sorunun nedeni, ilgili SQL Server Instance'ının Database Engine servisini çalıştıran Windows servis hesabının Active Directory'de herhangi bir özel yetkiye sahip olmayan (bu servis kullanıcısı, SQL Server sunucusunda Yerel Yöneticiler grubunun bir üyesiydi) yerel bir Windows servis hesabı olmasıydı.

"Active Directory'de herhangi bir özel yetkiye sahip olmayan" bunu özellikle belirttim, çünkü bu sorun ile, eski bir SQL Server Instance'ımızı daha yeni bir donanıma sahip olan sunucuya "Side by Side" şeklinde taşıdıktan sonra karşılaştık. Önceki sunucudaki SQL Server Database Engine servisi de yine aynı isimli bir yerel Windows servis hesabıyla "bir şekilde" çalışmaktaydı. Henüz nasıl çalışmakta olduğunu anlayamadık, umarım zaman bulur da en kısa zamanda anlayabiliriz. Normal şartlar altında Active Directory ortamında en iyi pratik SQL Server servis hesabı olarak bir Domain servis hesabı kullanmaktır, fakat nedense zamanında bu sunucu için böyle yerel bir servis kullanıcısı kullanılmış.

Kısa kesersem, bu sorundan kurtulmak için SQL Server servis hesabınız için ya bir Domain servis hesabı kullanın ya da Local System hesabını kullanın; çoğu durumda birincisi tercih nedeni olmalı.

20 Eylül 2010 Pazartesi

Failed to decrypt protected XML node "DTS:Password" with error 0x80070002 "The system cannot find the file specified.". You may not be authorized to a

HATA:
Failed to decrypt protected XML node "DTS:Password" with error 0x80070002 "The system cannot find the file specified.". You may not be authorized to access this information. This error occurs when there is a cryptographic error. Verify that the correct key is available. End Error Error: 2010-09-20 17:06:12.90 Code: 0xC0016016 Source: Description: Failed to decrypt protected XML node "DTS:Password" with error 0x80070002 "The system cannot find the file specified.". You may not be authorized to access this information. This error occurs when there is a cryptographic error. Verify that the correct key is available. End Error Error: 2010-09-20 17:06:56.19 Code: 0xC002F210 Source: DTSTask_DTSExecuteSQLTask_1... The package execution fa... The step failed.

AÇIKLAMA:
Biz bu hatayı aldığımızda sorun, ilgili SSIS paketinin içindeki adımlardan birisinin hata almasıydı.

ÇÖZÜM
Eğer böyle bir hata ile karşılaştıysanız, ilgili SSIS paketini Export edip incelemenizi tavsiye ederim. Örneğin bu hata mesajındaki sorun, "DTSTask_DTSExecuteSQLTask_1" adındaki adımdan kaynaklanıyordu. Paketi doğrudan gidip siz çalıştırdığınızda hatanın daha ayrıntılı açıklamasını görebilirsiniz.

Unable to start execution of step 1 (reason: Error authenticating proxy DOMAIN\KULLANICI, system error: ConnGetProxyPassword). The step failed.

HATA:
Unable to start execution of step 1 (reason: Error authenticating proxy DOMAIN\KULLANICI, system error: ConnGetProxyPassword). The step failed.

AÇIKLAMA:
Ben bu hata ile bir Job çalıştırılırken karşılaştım. Söz konusu hata, Job'ın içindeki SSIS paketinin bir Proxy ile çalıştırılması sonucu oluşuyordu. Proxy hesabı da bir Credential kullanıyor ve sorun, Credential tanımında kullanıcı için hatalı şifre tanımlanmasından kaynaklanıyordu.

ÇÖZÜM:
İlgili Credential ayarlarının doğru yapıldığından emin olun. Kullandığınız kullanıcı bilgilerinin doğru girildiğinden emin olun.

17 Eylül 2010 Cuma

The client was unable to reuse a session with SPID 117, which had been reset for connection pooling. This error may have been caused by an earlier ope

HATA:
The client was unable to reuse a session with SPID xxx, which had been reset for connection pooling. This error may have been caused by an earlier operation failing. Check the error logs for failed operations immediately before this error message.

AÇIKLAMA:
Bir SQL Server Instance'ımızı donanım yükseltmesi nedeniyle başka bir sunucuya taşıyorduk (Side by Side Upgrade). Bu sırada yeni sunucumuzdaki SQL Error Log'unda bol bol bu hata mesajına rastladık ve bu sırada test yapan analistler bir takım hatalar aldıklarını söylüyorlardı... Hatanın nedeninin uygulama kullanıcısının (Login'inin) varsayılan dil ayarının (Default Language) "Türkçe" yerine "English" olarak ayarlanmasından kaynaklandığını bulduk. Bunu değiştirdikten sonra Error Log'da hâlâ zaman zaman bu hata mesajından görmekteydik. Bunun nedeninin de havuzdaki bağlantılardan olduğunu anladık.

ÇÖZÜM:
Öncelikle ilgili kullanıcıların varsayılan dil ayarlarını olması gerektiği gibi düzelttik ve ardından da bu değişikliği yaptığımız andan önce oluşturulan oturumları (Session) sonlandırdık (KILL).

Bu oturumları "SELECT * FROM master..SYSPROCESSES WHERE spid>50" komutuyla bulabilirsiniz. "login_time" değerleri de o oturumun kullanıldığı en son andır. Eski olanları veya temiz olsun diye tüm oturumları sonlandırabilirsiniz.

16 Eylül 2010 Perşembe

Proxy (1) is not allowed for subsystem "SSIS" and user "xxxUser". Grant permission by calling sp_grant_proxy_to_subsystem or sp_grant_login_to_proxy

HATA:
Proxy (1) is not allowed for subsystem "SSIS" and user "xxxUser". Grant permission by calling sp_grant_proxy_to_subsystem or sp_grant_login_to_proxy.

AÇIKLAMA:
Aslında hata mesajında ne yapılacağı belirtiliyor. Hatanın alınma nedeni, paketi çalıştırmak istediğiniz Login'in, ilgili Proxy hesabını kullanma hakkının bulunmamasıdır. Ben bu hatayı, bir Job'ı oluşturmaya çalışırken aldım.

ÇÖZÜM:
EXEC msdb.dbo.sp_grant_login_to_proxy @proxy_name=N'', @login_name=N'xxxUser'

"Cannot insert the value NULL into column 'owner_sid', table 'msdb.dbo.sysjobs'; column does not allow nulls. INSERT fails."

HATA:
"Cannot insert the value NULL into column 'owner_sid', table 'msdb.dbo.sysjobs'; column does not allow nulls. INSERT fails."

AÇIKLAMA:
Bir sunucumuz fiziksek olarak değiştirileceği için bir SQL Server Instance'ımızın aynısını yeni sunucuda oluşturuyorduk. Bilirsiniz, Login'ler, Linked Server'lar, SSIS paketleri, Job'lar aktarılıyordu... Tam bu sırada bir Job'k aktarırken bu hata mesajını aldık.

ÇÖZÜM:
Eğer bu hata mesajını alıyorsanız, aktarmaya çalıştığınız Job'ın Owner'ı aktarım yaptığınız hedef SQL Server Instance'ında yoktur. sp_add_job sistem SP'sinin @owner_login_name parametresinin değeri olarak belirtilen Login'in hedef sunucuda bulunduğundan emin olun. Yoksa da oluşturun veya uygun başka bir Login ile değiştirin.

7 Eylül 2010 Salı

İpucu: Uzaktaki sunucunuza RDP yapacaksınız ama kullanılabilecek oturum yok!

Bu konu doğrudan SQL Server ile alakalı olmasa da, DBA olarak işinize yarayacak bir ipucu olduğunu düşünüyorum. En azından ben gün içerisinde sık sık kullanmak durumunda kalabiliyorum.

Eğer benim ortamımda olduğu gibi sizin ortamınızda da bol bol SQL Server sunucusu varsa ve bunlara sistem yöneticileri, operasyon, SAN bölümü, uygulama bölümü gibi bölümlerden arkadaşların zaman zaman bağlanmaları gerekiyor ve bağlandıktan sonra da oturumlarını kapatmak yerine doğrudan bağlantılarını koparıyor ve oturumlarını açık bırakıyorlarsa, sunucuya RDP yapmak istediğiniz zaman müsait oturumun olmadığına dair şöyle bir mesajla karşılaşırsınız: "The terminal server has exceeded the maximum number of allowed connections."

İşte o anda ya Admin\Console olarak bağlanacaksınız ya da o sunucuda oturum açmış kişileri tahmin edebiliyorsanız veya biliyorsanız onları arayıp size oturum açmalarını isteyeceksiniz veya en kötü ihtimalle işinizi erteleyeceksiniz.

Çözüm olarak ise, eğer işletim sistemi olarak bilgisayarınızda bir Server OS kullanıyorsanız o zaman "tsadmin" konsolunu kullanıp uzaktaki sunucuda bulunan oturumları görüp bunları kapatabilirsiniz. Veya ister bir Server OS ister bir Client OS olsun, Command Prompt'tan kullanabileceğiniz "Query User" komutuyla uzaktaki sunucuda (eğer yeterli haklarınız varsa, portlarınız açıksa) bulunan oturumları görüp, bu oturumları sonlandırabilirsiniz.

Veya kısayol olarak "qwinsta" ve "rwinsta" komutlarını kullanabilirsiniz. "qwinsta" komutunu, uzaktaki sunucuda bulunan oturumları sorgulamak için, "qwinsta" komutunu ise uzaktaki sunucuda bulunan oturumları sonlandırmak için kullanabilirsiniz.

Bu komutlar hakkında daha fazla bilgi almak için örneğin "qwinsta /?" komutunu çalıştırabilirsiniz.

Bu komuta bir örnek vermek gerekirse, "qwinsta" veya doğrudan "Query User /server:" komutuyla uzaktaki sunucuda bulunan oturumları ve ID'lerini gördükten sonra aşağıdaki komut ile örneğin 2 ID numaralı oturumu sonlandırabilirsiniz. Bu örnekte uzaktaki sunucunun adı "PRODSQLSRV"dir.

"qwinsta 2 /server:"

6 Eylül 2010 Pazartesi

İpucu: "sp_validatelogins" ve "sp_change_users_login"

sp_validatelogins

Bu sistem SP'si ile, bir SQL Server Instance'ınızda Active Directory'den silinmiş Windows Login'lerinizi tespit edebilirsiniz.

SP'yi "master" veritabanı altında çalıştırabilirsiniz, eğer Active Directory'den silinmiş bir Windows Login'iniz var ise, o zaman bu SP size aşağıdaki gibi bir sonuç döndürür:

SID NT Login
0x010500000000000515000000AE78308265B37A613F005BB0A00C0000 CONTOSO\ONSOYEK

Bu Login, herhangi bir Active Directory kullanıcısıyla bağlantılı olmadığı için zaten bir işe yaramamaktadır, bu nedenle rahatlıkla silinebilir.

Bu SP hakkında daha fazla bilgi için Books Online'ı kurcalayabilirsiniz: http://msdn.microsoft.com/en-us/library/ms181728.aspx

Bu SP'yi "sp_change_users_login" sistem SP'sine de benzetebilirsiniz. Bu SP ile de veritabanı seviyesinde yetim kalmış (orphaned) SQL User'larını tespit edebilir ve Login'leriyle eşleştirebilirsiniz.

sp_change_users_login

Bir veritabanında yetim SQL kullanıcılarını tespit etmek için aşağıdaki gibi bir komut çalıştırabilirsiniz:

USE
GO
EXEC sp_change_users_login 'report'
GO

Eğer bir sonuç dönerse o zaman bu, o veritabanında yetim kalmış SQL User'larının olduğu anlamına geliyordur. Bunu düzeltmek için de aşağıdaki gibi bir komut çalıştırabilirsiniz:

USE
GO
EXEC sp_change_users_login 'Auto_Fix', ''
GO

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

Özetle, sp_validateusers, yetim Windows Login'lerini tespit etmek için; sp_change_users_login de yetim kalmış SQL User'larını tespit etmek içinn kullanılabilir.

The SELECT permission was denied on the object 'extended_properties', database 'mssqlsystemresource', schema 'sys'. (Microsoft SQL Server, Error: 229)

HATA:
The SELECT permission was denied on the object 'extended_properties', database 'mssqlsystemresource', schema 'sys'. (Microsoft SQL Server, Error: 229)

AÇIKLAMA:
Bir veritabanında yetkileriniz olsa dahi (örneğin db_owner veritabanı rolünün bir üyesi olsanız bile) herhangi bir tablo için SELECT ile bir sorgu çalıştırdığınızda böyle bir hata mesajıyla karşılaşabilirsiniz.

Beni yaşadığım sorunda bunun nedeni, o tabloda veya veritabanında sizin kullanıcınıza veya dahil olduğunuz bir Windows Domain Group'una ilgili SQL Server Instance'ındaki ilgili veritabanında "db_denydatareader" veya "db_denydatawriter" haklarının verilmesidir.

ÇÖZÜM:
Doğrudan kullanıcınızın veya kullanıcınızın dahil olduğu bir gruba bu yetkinin atanmadığından emin olun.

5 Eylül 2010 Pazar

The database principal owns a schema in the database, and cannot be dropped. (Microsoft SQL Server, Error: 15138)

HATA:
"The database principal owns a schema in the database, and cannot be dropped. (Microsoft SQL Server, Error: 15138)"

AÇIKLAMA:
Bir veritabanı kullanıcısını silmeye çalıştığınızda böyle bir hata mesajıyla karşılaşabilirsiniz.

ÇÖZÜM:
Veritabanı kullanıcısını silmeden önce, bu kullanıcının sahibi olduğu Schema' ları silmelisiniz.

Schema' a SSMS' ten:
Object Explorer -> Server Name-> Databases -> -> Security -> Schemas

veya

T-SQL ile:
USE
GO
SELECT dp.name [Veritabanı kullanıcısı], s.name [Schema adı] FROM sys.schemas s
INNER JOIN sys.database_principals dp ON s.principal_id = dp.principal_id
WHERE dp.name = 'EKREM-PC\EKREM'

Not: Bu T-SQL örneğinde veritabanındaki silinecek kullanıcının adı EKREM-PC sunucusundaki EKREM' dir. Yani "EKREM-PC\EKREM"

Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not hav

HATA:
"Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission."

AÇIKLAMA:
Çeşitli nedenlerden dolayı bir veritabanının sahibi silinebilir veya boş kalabilir. Bir veritabanının sahibi olmadığında ve bir nesne oluşturulmaya çalışıldığında böyle bir hata mesajıyla karşılaşılabilinir.

ÇÖZÜM:
İlgili veritabanının geçerli bir sahibi olmasını sağlarsanız bu hatayı atlatabilirsiniz.

Bir veritabanının sahibini değiştirmek için aşağıdaki komutu kullanabilirsiniz:

USE
GO
sp_changedbowner ''

SSIS Error Code DTS_E_OLEDB_EXCEL_NOT_SUPPORTED: The Excel Connection Manager is not supported in the 64-bit version of SSIS, as no OLE DB provider is

HATA:
"SSIS Error Code DTS_E_OLEDB_EXCEL_NOT_SUPPORTED: The Excel Connection Manager is not supported in the 64-bit version of SSIS, as no OLE DB provider is available."

AÇIKLAMA:
Bir SSIS paketi ile SQL Server’ dan Excel’ e aktarım işlemi yapmaya çalıştığınızda bu hata mesajı ile karşılaşabilirsiniz.

ÇÖZÜM:
Eğer bu SSIS paketini bir Job’ ın içerisinde çalıştırıyorsanız (ki benim durumumda böyleydi) o zaman Job’ ın Özelliklerinden, ilgili Step’ in özelliklerine gidin ve General sayfasında bulunan “Execution options” sekmesindeki “Use 32 bit runtime” seçim kutusunun işaretli olduğundan emin olun.

İpucu: Indexed View

Indexed View' lerin, Query Optimizer tarafından uygun görüldüğü takdirde SQL Server 2005 ve üst versiyonlarının Enterprise Edition'ları tarafından otomatik olarak kullanılabileceğini biliyor muydunuz?

SQL Server 2005'in diğer Edition'ları için ise, Query Optimizer'ın Indexed View'leri kullanması için "NOEXPAND" Table Hint' ini kullanmanız gerekiyor.

Bir Database Snapshot' ı Silmek

Normalde, kullanıcıların bağlı olduğu bir veritabanını doğrudan DROP DATABASE komutuyla silemezsiniz; fakat bu veritabanı eğer bir Database Snapshot ise, o zaman doğrudan "DROP DATABASE" gibi bir komutla kaç kullanıcı bağlı olursa olsun bu veritabanını silebilirsiniz. Burada dikkat edilmesi gereken ise, bu komutu çalıştıracak kullanıcının bu Database Snapshot' a o anda bağlantısı olmaması gerektiğidir. Aksi takdirde "Cannot drop database because it is currently in use." hatasını alırsınız.

Database Snapshot' tan dönmek

Veritabanınızın Database Snapshot' ını kullanarak, herhangi bir nedenden dolayı veritabanınızı eski haline getirmek için Database Snapshot' ın alındığı ana geri dönebileceğinizi biliyor muydunuz?

Örneğin, aynı günün sabahı saat 9:00' da veritabanınızın Database Snapshot' ını oluşturdunuz diyelim ve saat 10:00' da veritabanınızda toplu bir güncelleştirme yapıldı ve bunun hatalı bir güncelleştirme olduğunu anladınız fakat elinizde ne yedek var ne de SQL Server bu işlemi geri almanıza izin vermiyor. İşte bunun gibi durumlarda "RESTORE DATABASE 'veritabanı_adı' FROM DATABASE_SNAPSHOT = 'database_snapshot_adı'" komutuyla veritabanınızı saat 9:00' daki haline döndürebilirsiniz.

Bu dönme işlemi boyunca ne Database Snapshot' ınız ne de veritabanınız kullanılabilir olmayacaktır, ayrıca ana veritabanınıza ait o anda sadece bir tane Database Snapshot olmalıdır; eğer birden fazla aynı veritabanına ait Database Snapshot varsa, sadece bir tane kalana kadar diğerleri silinmelidir.

SSMS: GO 'sayı'

Query Editor' de bir komutu bir döngüye sokmak için GO komutunu kullanabileceğinizi biliyor muydunuz?

Örnek: "SELECT GetDate() GO 1000" komutu, GetDate() fonksiyonunun 1000 kere çalışmasını sağlayacaktır.

Sorgu çalıştırma süresi

Bazen şöyle bir soru alıyorum: "Bir sorguyu Query Analyzer' da veya Query Editor' de çalıştırdığım zaman, çalışma süresi olarak en az saniyeyi görebiliyorum, süreyi milisaniye olarak nasıl görebilirim?"

Eğer bir sorgunun çalışma süresi, çalışırken derlenme ve optimizasyon için ne kadar CPU zamanı harcadığı gibi bilgileri pratik olarak görmek için SET STATISTICS TIME ON komutunu kullanabilirsiniz. Ayrıca bu komut, SSMS' teki Tools\Options->Query Execution->SQL Server->Advanced bölümünden varsayılan hale de getirilebilir.

DİKKAT: SSMS - Database Properties penceresi...

SQL Server Management Studio 2008' deki Database Properties -> Files penceresini kullanarak bir veritabanının veri dosyalarında değişiklikler istediğinizde bunu bu pencereden yapmamanızı tavsiye ederim. Çünkü bu arayüzden yapılınca, SQL Server veritabanı dosyalarını Shrink etmeye çalışıyor. Bu da genelde, özellikle de üretim ortamında yapılıyorsa iyi bir şey değildir.

Bunun yerine, yine aynı pencereyi kullanarak istediğiniz değişiklikleri yapabilirsiniz; fakat OK tuşuna basmayın, bunun yerine pencerenin üst tarafındaki Script tuşunu kullanın ve işlemi Script' leyin ve Shrink komutlarını çıkartarak yapmak istediğiniz değişikliklere ait komutları Query Editor' de çalıştırın.

SQL Server Profiler

Profiler' daki "Duration" alanındaki değerler, SQL Server 2005 ve daha sonrası için eğer istenirse mikrosaniye veya milisaniye olarak gösterilebiliyor (Tools->Options).

Eğer mikrosaniye olarak gösterilmesi için ayarlamazsanız örneğin Profiler' da "1694" gibi gördüğünüz bir değeri, bu Trace' i bir tabloya aktardığınızda "1694850" olarak göreceksiniz. Yani aslında sizin Tools->Options' tan yapacağınız ayar sadece arayüzde yeniden biçimlendirme yapar, verinin öyle kaydedilmesini sağlamaz. Veri her zaman mikrosaniye olarak kaydedilir. Bilginize ;)

SQL Server 2008 R2: Reporting Services

SQL Server 2008 R2' dan itibaren Reporting Services, Windows Server 2003 ve Windows Server 2003 R2 Itanium versiyonlar için desteklenmeyecek.

Eğer SQL Server 2008 R2' nun Reporting Services bileşenini Itanium bir sunucuda kullanmak istiyorsanız, İşletim Sisteminizi Windows Server 2008 veya Windows Server 2008 R2 Itanium versiyonuna yükseltmeniz gerekmektedir.

Internal I/O request 0x4BD9EAE8: Op: Write, pBuffer: 0x05350000, Size: 983040, Position: 369629696, UMS: Internal: 0x103, InternalHigh: 0x0, Offset:

HATA:
"Internal I/O request 0x4BD9EAE8: Op: Write, pBuffer: 0x05350000, Size: 983040, Position: 369629696, UMS: Internal: 0x103, InternalHigh: 0x0, Offset: 0x16081A00, OffsetHigh: 0x0, m_buf: 0x05350000, m_len: 983040, m_actualBytes: 0, m_errcode: 112, BackupFile: C:\xxx\veritabani_adi.bak"

AÇIKLAMA:
Yedek alma işlemi sırasında böyle bir hata ile karşılaşabilirsiniz.

ÇÖZÜM:
Ben bu sorunla karşılaştığımda, sorunun nedeni yedek alınmaya çalışılan diskte yeterli boşlukta yer olmayışıydı.

Eğer bu hata ile karşılaşırsanız tavsiyem, yedek alıyor olduğunuz diskte yeterli boş alanın olup olmadığından emin olmanızdır.

"RESTORE cannot process database 'veritabanı adı' because it is in use by this session. It is recommended that the master database be used when perfor

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

AÇIKLAMA:
Log Shipping sisteminizdeki Restore Job' ında böyle bir hata ile karşılaşabilirsiniz.

ÇÖZÜM:
Ben bu hata ile, bir Log Shipping kurulumumuzun Secondary sunucusundaki Restore Job' ında karşılaştım.

Bu hata mesajını Restore Job' ının History' sinde gördüm. Yaptığım ilk iş, veritabanının SINGLE_USER modunda mı yoksa MULTI_USER modunda mı olduğunu kontrol etmekti. Yaptığım kontrol sonucu gördüm ki, veritabanı SINGLE_USER modundaydı. Bu ayarı aşağıdaki gibi bir kod ile MULTI_USER olarak değiştirdikten sonra bu hatadan kurtuldum.

USE [master]
GO
ALTER DATABASE [veritabanı adı] SET MULTI_USER WITH ROLLBACK IMMEDIATE
GO

SQL Login'in şifresi ne zaman değiştirildi?

Gün gelir lâzım olur da bir SQL Login'in şifresinin ne zaman değiştirildiğini öğrenmeniz gerekirse ne yaparsınız?

SELECT LOGINPROPERTY('kullanıcı adı', 'PasswordLastSetTime') komutunu kullanıp, ilgili kullanıcının şifresinin değiştirildiği zaman bilgisini ayrıntılı olarak görebilirsiniz.

Bir SQL Server 2005 Failover Cluster Bug'ı

SQL Server 2005 Failover Clustering kurulumundan sonra, Cluster Administrator'dan SQL Server Resource Group'taki SQL Server Resource' unun Properties->Advanced penceresinde bulunan "Affect the group" seçim kutusu boş geliyor.

Halbuki bunun seçili olması gerekiyor. SQL Server 2005 SP3' te de durum aynı, bu sorun hâlâ düzeltilmiş değil. SQL Server 2000 ve 2008'de ise böyle bir sorun yok. Bu nedenle SQL Server 2005 Failover Clustering kurulumlarınızdan sonra, SQL Server Resource Group' u için "Affect the group" seçeneğini elle seçili hale getirmelisiniz.

SQL Server Failover Clustering' te Aktif Düğüm Hangisi?

SQL Server 2005 ve üstü versiyonlarda SQL Server Failover Clustering' in aktif düğümünü, SELECT SERVERPROPERTY('ComputerNamePhysicalNetBios') komutuyla tespit edebilirsiniz.