Sıkça Sorulan Sorular
-
04 Ekim 2010 Pazartesi 07:24Moderatör
Sıkça Sorulan Sorular
Bu konuda Microsoft SQL Server hakkında en sık sorulan soruların cevaplarını vermeye çalışacağım. Konu içerisinde belki aklınızdaki her sorunun cevabını bulamayabilirsiniz ancak genel olarak faydalı olacağı düşüncesindeyim. Konu, BT Uzmanı arkadaşların aradıkları cevabı hızlı ve kolaylıkla bulabilmesi için hazırlanmıştır. Bizim her zaman en önemli önceliğimiz Microsoft SQL Server forumlarının BT Uzmanlarının ve yeni başlayanların sorularını sorup cevap aldığı, yeni teknolojiler hakkında düşüncelerini paylaştıları bir forum ortamı yaratmaktır. Bu platformu zaman içerisinde geliştirmek için önerilerinizi beklemekteyiz.
Son olarak Forumlarda soru sorup başkalarına yardım eden tüm kullanıcılarımıza teşekkür ederiz.
1) Microsoft SQL Server 2008 deneme sürümünü nereden indirebilirim?
3) SQL Server 2005 de Veritabanı De-Attach işlemini nasıl gerçekleştirebilirim?
4) SQL Server 2008’in sorunsuz yüklendiğini nasıl kontrol edebilirim?
5) SQL Server Management Studio da bağlı sunucumu nasıl kaydettirebilirim?
6) SQL Server'a paketleri dağıtmak için hangi adımları izlemeleliyim?
7) SQL Server 2008 R2 de Nasıl Yedek Alabilirim?
8) SQL Server sürümü, sürüm düzeyi ve Service pack seviyesini nasıl belirleyebilirsiniz?
9) Neden SQL Server 2008 yüklerden "Bilgisayarı Yeniden Başlat" kuralını pas geçemiyorum?
10) SQL Server örneğinin (instance) ismini nasıl değiştiririm?
12) Tek veritabanı içerisinde birçok dilden veriyi nasıl saklarım?
13) Uzun süreli engellemeyi nasıl tespit edebilirim?
Yazılım Geliştiriciler için Sıkça Sorulan Sorular
1)Iki tarih arasındaki verilerin bulunması
2)Duplicate(kopya) satırların bulunup silinmesi
3)Veritabanı içerisindeki tüm verinin silinmesi
4)Saklı yordamın (stored procedure) aynı anda sadece 1 kere kullanıldığından emin olmak
6)Bir kolondan virgüllerle ayrılmış liste oluşturma
7)Verilerin bütününün getirilmesi yerine belirli bir aralıktaki kayıtları getirme
8)Her grup için Top N kaydın seçilmesi
9)Tüm kullanıcı tanımlı veritabanlarının detach edilmesi
10)Sunucu üzerindeki veritabanlarının en son yedek alınma tarihini öğrenme
11)En uzun sürede işletilen prosedürlerin bulunması
12)Sunucu üzerindeki sabit disklerde kalan boş alanı öğrenme
13)Veritabanı dosyaları üzerinde kalan boş alanı öğrenme
14)Devam eden process bilgilerini almak
Sıkça Sorular Soruların hazırlanması işleminde yaptığı katkılardan
dolayı değerli moderatörümüz Ekrem Önsoy'a (MVP) çok teşekkür
ederim.
Serkan Bark, MSFT
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez
c- Düzenleyen Emre GunerturkModerator 01 Şubat 2011 Salı 13:01 Geliştiriciler için sıkça sorulan sorular eklendi
Tüm Yanıtlar
-
04 Ekim 2010 Pazartesi 07:25Moderatör
1) Microsoft SQL server 2008 deneme sürümünü nereden indirebilirim?
http://www.microsoft.com/sqlserver/2008/en/us/trial-software.aspx
Serkan Bark, MSFT  
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez -
04 Ekim 2010 Pazartesi 07:25Moderatör
Bu davranışı gidermek için SQL Server 2005 CD'den Integration Services hizmetini yükleyin. Bunu yapmak için şu adımları izleyin:
1. SQL Server Installation Wizard Çalıştır.
2. Tarama tamamlandıktan sonra sistem yapılandırması denetimi sayfasında İleri'yi tıklatın.
3. Ad kutusuna ve şirket kutusuna uygun bilgileri girin ve İleri'yi tıklatın.
4. Integration Services onay kutusunu seçmek için tıklatın ve sonra İleri'yi tıklatın.
5. İleri'yi tıklatın ve Yükle'yi tıklatın.
6. Yükleme tamamlandığında, İleri'yi tıklatın ve ardından Son'u tıklatın.Daha fazla bilgi için : http://support.microsoft.com/kb/909036
Serkan Bark, MSFT  
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez -
04 Ekim 2010 Pazartesi 07:26Moderatör
3) SQL Server 2005 de Veritabanı De-Attach işlemini nasıl gerçekleştirebilirim?
Bir veritabanını ayırmak için;
a)SQL Server Management Studio Object Explorer, SQL Server Database Engine kopyasına bağlanın ve örneğini genişletin.
b)Veritabanları ' nı genişletin ve ayırmak istediğiniz kullanıcı veritabanı adını seçin.
c)Bir veritabanı ayırma veritabanı özel kullanım erişimi gerektirir. Veritabanı kullanımda ise, tek bir kullanıcı erişimi kısıtlayın:Veritabanı adını sağ tıklatın ve Özellikler için gelin.
Sayfa bölmesini seçin, seçenekleri seçin.
Diğer seçenekleri bölmesinde durumu seçeneklerine ilerleyin.
Restrict Access seçeneğini seçin ve kendi açılan listesinde tek seçin.
Tamam'ı tıklatın.
Bu eylem veritabanı tüm bağlantıları kapatın bildiren bir ileti kutusu görüntülenir. Devam etmek için Tamam'ı tıklatın.d)Veritabanı adını sağ tıklatın, Görevler ' e gidin ve sonra Ayır ' ı tıklatın. Detach veritabanı iletişim kutusu görüntülenir.
e)Veritabanları ayırmak için kılavuz seçili veritabanının adını Veritabanı adı sütununda görüntüler. Ayırmak istediğiniz veritabanı olduğunu doğrulayın.
f)Varsayılan olarak, ayırma işlemi herhangi bir güncel optimizasyonu istatistikleri İstatistikleri Güncelleştir onay kutusunu tıklatın, varolan optimizasyonu istatistikleri güncelleştirmek için veritabanı; ayırma korur.
g)Varsayılan olarak, veritabanı ile ilişkili herhangi bir tam-metin katalogları ayırma işlemi tutar. Bunları kaldırmak için Tam metin kataloglarını Koru onay kutusunu temizleyin.
h)Durum sütunu (hazır veya Not Ready) geçerli veritabanı durumunu görüntüler.Durumu Değil hazır ise, Message sütun Köprülü veritabanı hakkında bilgi görüntüler. Çoğaltma ile ilgili bir veritabanı, veritabanı çoğaltılmış Message sütunu görüntüler. Ne zaman bir veritabanı varsa veya daha etkin bağlantıları, Message sütun <number_of_active_connections> Active bağlantıları görüntüler; örneğin, 1 Active bağlantıları. Veritabanını ayırmadan önce Alt bağlantıları onay kutusunu seçerek etkin bağlantıları kesmelisiniz.
Bir ileti hakkında daha fazla bilgi edinmek için köprüyü tıklatın.
i)Veritabanını ayırmak hazır olduğunuzda, Tamam ' ı tıklatın.
Daha fazla bilgi için : http://technet.microsoft.com/en-us/library/ms191491.aspx
Serkan Bark, MSFT  
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez -
04 Ekim 2010 Pazartesi 07:26Moderatör
4) SQL Server 2008’in sorunsuz yüklendiğini nasıl kontrol edebilirim?
SQL Server 2008 yüklemenin başarılı olduğunu doğrulamak için Hizmetleri yüklemeyi seçtiğiniz bileşenleri bilgisayarınızda çalıştığından emin olun.
a) SQL Server (ÖrnekAdı)
b) SQL Server Agent (ÖrnekAdı)
c) Reporting Services (ÖrnekAdı)
d) SQL Server BrowserDaha fazla bilgi için : http://technet.microsoft.com/en-us/library/bb510455.aspx
Serkan Bark, MSFT  
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez -
04 Ekim 2010 Pazartesi 07:26Moderatör
5) SQL Server Management Studio da bağlı sunucumu nasıl kaydettirebilirim?
a) Object Explorer'da bağlı olduğunuz sunucu üzerine sağ tıklayıp Kaydet’i tıklayın
b) Register Server iletişim kutusunda metin kutusuna, bu sunucu için görünmesini istediğiniz adı yazın. Bu sunucunun adı olması gerekmez
c) Server açıklama metin kutusuna isteğe bağlı olarak sunucu tanımanıza yardımcı olacak ek bilgiler yazın.
d) Bir sunucu grubu seçin kutusunda, bir sunucu grubunu tıklatın ve Kaydet ' i tıklatın.Daha fazla bilgi için : http://technet.microsoft.com/en-us/library/ms188717.aspx
Serkan Bark, MSFT  
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez -
04 Ekim 2010 Pazartesi 07:27Moderatör
6) SQL Server'a paketleri dağıtmak için hangi adımları izlemeleliyim?
a) Hedef bilgisayar dağıtım klasörünü açın.
b) Paket Yükleme Sihirbazı'nı başlatmak için Bildirim dosyası < proje adı > .SSISDeploymentManifest çift tıklatın.
c) SSIS paketleri dağıtma sayfasında SQL Server dağıtım seçeneği seçin.
d) İsteğe bağlı olarak, hedef sunucuda yüklü sonra paketleri doğrulamak için Doğrula yüklemeden sonra paketleri seçin.
e) Hedef SQL Server belirtin sayfasında, paketleri yüklemek ve bir kimlik doğrulama modunu seçmek için SQL Server örneğini belirtin. SQL Server kimlik doğrulaması seçerseniz, kullanıcı adı ve parola sağlamanız gerekir.
f) Yükleme klasörünü seç sayfasında yüklenecek paket bağımlılıkları için dosya sistemindeki klasörü belirtin.
g) Paket yapılandırmalarını içeriyorsa, değerleri paketleri Yapılandır sayfasında değer listesinde güncelleştirerek yapılandırmaları düzenleyebilirsiniz
h) Yüklemeden sonra paketleri doğrula seçildi ise, dağıtılan paketlerim doğrulama sonuçlarını görüntüleyebilirsiniz.Daha fazla bilgi için : http://technet.microsoft.com/en-us/library/ms140117(SQL.90).aspx
Serkan Bark, MSFT  
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez -
04 Ekim 2010 Pazartesi 07:27Moderatör
7) SQL Server 2008 R2 de Nasıl Yedek Alabilirim?
Bir veritabanını yedeklemek için
a) Microsoft SQL Server Database Engine da uygun örneğe bağlandıktan sonra Object Explorer'da sunucu adını tıklatın vesunucu ağacı genişletin.
b) Veritabanları ' nı genişletin, bir kullanıcı veritabanını seçin veya Sistem veritabanları ' nı genişletip bir sistem veritabanını seçin.
c) Veritabanını sağ tıklatın, Görevler ' e gidin ve ardından Yedekle'yi tıklatın. Burada Veritabanı Yedekle iletişim kutusu görüntülenir.
d) Veritabanı liste kutusunda, veritabanı adını doğrulayın. İsteğe bağlı olarak farklı bir veritabanı listeden seçebilirsiniz
e) Herhangi bir kurtarma modeli için (FULL, BULK_LOGGED veya SIMPLE) bir veritabanı yedekleme gerçekleştirebilirsiniz.
f) Tam yedekleme türünü liste kutusundan seçin.
g) Yedekleme bileşeni için veritabanı ' nı tıklatın
h) Varsayılan yedekleme kümesi adı metin kutusunda önerilen adı kabul edin veya yedekleme kümesi için farklı bir ad girin
i) İsteğe bağlı olarak, Açıklama metin kutusuna, yedekleme kümesinin açıklamasını girin.
j) Yedekleme kümesi sona erme tarihini belirtin ( Optional )
k) Yedekleme hedef tür disk veya teyp tıklatarak seçin. En fazla 64 disk yolları seçin veya bir tek ortam kümesi içeren sürücüler teyp için Ekle'yi tıklatın. Seçili dizin yolları için yedekleme liste kutusunda görüntülenir.
l) Gelişmiş seçenekleri seçmek ve görüntülemek için Seçenekler ' i tıklatın.
m) Güvenilirlik bölümünde, isteğe bağlı olarak aşağıdaki adımları işaretleyin
a. Bittiğinde yedeği kontrol et
b. Medya ya yazmadan önce sağlama topla
c. Hata olduğunda devam et
n) Tamam’ı tıklatın.Daha fazla bilgi için ; http://msdn.microsoft.com/en-us/library/ms187510.aspx
Serkan Bark, MSFT  
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez -
04 Ekim 2010 Pazartesi 07:27Moderatör
8) SQL Server sürümü, sürüm düzeyi ve Service pack seviyesini nasıl belirleyebilirsiniz?
http://support.microsoft.com/kb/321185
Serkan Bark, MSFT  
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez -
04 Ekim 2010 Pazartesi 07:28Moderatör
9) Neden SQL Server 2008 yüklerden "Bilgisayarı Yeniden Başlat" kuralını pas geçemiyorum?
Sorun: Bazen SQL Server kurulumu sırasında Setup Support Rules adımına gelindiğinde bilgisayarın yeniden başlatılması gerektiği gibi bir bilgilendirme mesajı görüntülenir. Bilgisayar birkaç kez yeniden başlatılmasına rağmen kurulum başarısız olmaktadır.
Çözüm: Bu durum çoğunlukla başka bir uygulama kurulumu sırasında PendingFileRenameOperations adlı kayıt defteri girdisinin doğru şekilde modifiye edilmemesi ya da silinmemesi durumunda ortaya çıkar.Çözüm için aşağıdaki adımlar uygulanabilir :
a) Kayıt defterini açın. Başlat -> Çalıştır, bu alana "regedit" yazıp Enter tuşuna basın.
b) HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager kayıt defteri girdisini bulun ve "PendingFileRenameOperations" anahtarındaki her değeri silin.
Serkan Bark, MSFT  
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez -
04 Ekim 2010 Pazartesi 07:28Moderatör
10) SQL Server örneğinin (instance) ismini nasıl değiştiririm?
Sorun: SQL Server örneğimin ismini değiştirmek istiyorum.
Çözüm: SQL Server örnek isminin direk değiştirilmesi işlemini desteklemez. Bu sorunun çözümü için aşağıdaki çözüm yollarını deneyebilirsiniz :
a) Hali hazırdaki SQL Server örneğini silip yeni bir isimle yeniden kurulumunu yapmak.
b) Bilgisayar ismini değiştirdiğinizde SQL Server örnek ismi de değişecektir.
Örneğin Ornek1 adında bir SQL Server örneğimiz olsun. Bilgisayar ismi de MyPC olsun,bu durumda SQL server örnek ismi \\MyPC\\Ornek1 olur,bilgisayar ismini YourPC yaparsak örnek ismi de \\YourPC\\Ornek1 olacaktır.
c) Varsayılan örneğin yeniden adlandırılması için aşağıdaki prosedürleri çalıştırın
sp_dropserver <old_name>;
GO
sp_addserver <new_name>, local;
GO
d) İsimlendirilmiş örneğe yeni isim vermek için :
sp_dropserver <old_name\instancename>
GO
sp_addserver <new_name\instancename>, local
GO
Detaylı bilgi için aşağıdaki bağlantıyı ziyaret edebilirsiniz:
http://technet.microsoft.com/en-us/library/ms143799.aspx
Serkan Bark, MSFT  
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez -
04 Ekim 2010 Pazartesi 07:28Moderatör
11) Sorun : Neden SQL Server Management Studio kullanarak SQL Server'a Windows Authentication ile kullanıcı girişi yapamıyorum?
SQL Server Management Studio kullanarak SQL Server'a Windows Authentication ile kullanıcı girişi yapamıyorum ancak SQL Authentication kullandığımda sorun olmuyor nedeni ne olabilir?
Çözüm: Sunucuya Windows Authentication kullaranak kullanıcı girişi yapmak istiyorsanız kullandığınız Windows hesabınızın sunucuya eklenmiş olduğundan emin olun. Windows hesabınızın eklenip eklenmediğini aşağıdaki Transact- SQL cümlesini çalıştırarak kontrol edebilirsiniz :
a. SELECT loginname FROM sys.syslogins
b. Eğer Windows hesabınız listelenmediyse bu hesabı sunucudaki kullanıcı giriş hesaplarına eklemeniz gerekir. Sistem yöneticisi hesabıyla SQL Server örneğine kullanıcı girişi yaptıktan sonra aşağıdaki Transact-SQL cümlesi çalıştırılmalıdır :CREATE LOGIN [Computer_Name\Local_Windows_Account_Name]
FROM WINDOWS WITH DEFAULT_DATABASE=[master]
GO
Yukarıdaki işlemi ayrıca Management Studio GUI'sinden de yapabilirsiniz. Object Explorer'dayken Security--> Logins,sağ tık -> New Login
Detaylı bilgi :
http://technet.microsoft.com/en-us/library/ms189751.aspx
Not: SQL Server Management Studio Windows Vista/7 üzerinde kuruluysa bu işlemleri yapmak için "yönetici olarak" başlatılmalıdır.
Serkan Bark, MSFT  
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez -
04 Ekim 2010 Pazartesi 07:28Moderatör
12) Tek veritabanı içerisinde birçok dilden veriyi nasıl saklarım?
Sorun: Internetin büyümesiyle birlikte global pazarda çalışmak için veritabanlarının genişlemesi çok önemlidir. Sunucunuz veritabanlarınız,tablolarınız ya da sütünlarınız için alfabeyi belirleyebilmenize rağmen alfabeler bir veri sayfası oluştururlar ve herhangi veri tipi için temsil ettikleri karakterler bellidir. Tüm dillerin desteklendiği bir veritabanı tasarımı oldukça zordur.
Çözüm: Öncelikle 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.
Unicode ile ilgili makale :
http://technet.microsoft.com/en-us/library/ms187828.aspx
Unicode kullanımı ile ilgili makale :
http://technet.microsoft.com/en-us/library/ms191200.aspx
Serkan Bark, MSFT  
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez -
04 Ekim 2010 Pazartesi 07:29Moderatör
13) Uzun süreli engellemeyi nasıl tespit edebilirim?
Sorun: Uygulamam bazen veritabanı üzerinde sorgular çalıştırıldığında donuyor. Bir engelleme durumu olduğunadan şüpheleniyorum. 1 dakikadan uzun süren işlemler için engellenen herhangi bir işlem olup olmadığını tespit etmek istiyorum bunu nasıl yapabilirim?
Çözüm: Uzun süreli engellemenin tespiti için BlockedProcessThreshold adlı konfigürasyon parametresi kullanabiliriz. Bu parametre ile birlikte kullanıcı tarafından konfigüre edilen server çapında bir engelleme-eşik süresi belirlenebilir. Bu eşik saniye cinsinden tanımlanır. Bu eşik süresini geçen her engelleme SQL Trace veya SQL Server Profiler tarafından yakalanır .
a) Aşağıdaki cümleyi çalıştırın:exec sp_configure 'show advanced options', 1;
reconfigure;
go
exec sp_configure 'blocked process threshold', 60;
reconfigure;
b) Engellenen işlem için eşik değer belirlendikten sonra izleme olayını yakalayın. İzleme olayları 60 saniyeyi geçen engellemeler için SQL Trace veya SQL Server Profiler tarafından yakalanabilir.
c) SQL Trace kullanıyorsanız sp_trace_setevent prosedürünü ve event_id = 137 alarak kullanınız.
d) SQL Profiler kullanıyorsunuz engellenmiş işlem rapor olayları snınıfını seçin.
Engellenmiş uygulamalar için aşağıdaki 2 adımı uygulayabilirsiniz :
İlk olarak SQL Server Management Studio içerisinden "select * FROM sys.sysprocesses where blocked<>0" cümlesini çalıştırarak bloklayan ya da bloklanan işlemleri görebilirsiniz.
Hangi programın engelleme işlemini gerçekleştirdiğini bulmak için "select * from sys.dm_exec_sessions where session_id=<bloker id>" cümlesini çalıştırmanız yeterli olacaktır.Detaylı bilgi için aşağıdaki bağlantıları ziyaret edebilirsiniz:
Engellenen işlem eşik seçeneği :
http://technet.microsoft.com/en-us/library/ms181150.aspxRapor olayı sınıfı:
http://technet.microsoft.com/en-us/library/ms191168.aspxSp_trace_setevent:
http://technet.microsoft.com/en-us/library/ms186265.aspx
Serkan Bark, MSFT  
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez -
04 Ekim 2010 Pazartesi 07:29Moderatör
Sorun: Bazen "Select column1,column2,… from tablo_adi" gibi bir T-SQL cümlesini çalıştırdığınızda SQL Server Management Studio'da Tables alanında tablo adını görülmemesi gibi olaylarla karşılaşabilirsiniz.
Çözüm: Sorun belirli bir nesne için (tablo,veritabanı) VIEW DEFINITION izninin olmamasından kaynaklanır.
Sorunun çözümü için kullanıcıya o nesne üzerinde VIEW DEFINITION izninin sağlanması gerekir. Bunu aşağıda yazan Transact-SQL cümlesini çalıştırarak yapabiliriz :
USE database_name;
GO
GRANT VIEW DEFINITION ON [object_name] TO [database_user/database_role]
Detaylı bilgi için aşağıdaki bağlantıyı ziyaret edebilirsiniz :
http://technet.microsoft.com/en-us/library/ms175808.aspx
Serkan Bark, MSFT  
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik "olduğu gibi benim tarafımdan" hazırlanmış olup, Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez -
01 Şubat 2011 Salı 13:09Moderatör
1) Iki tarih arasındaki verilerin bulunması
Bir sistemde en çok gereksinim duyulacak özelliklerden biri de verinin kronolojik olarak takip edilebilmesidir. Bu noktadan bakıldığında 2 tarih arasındaki verinin elde edilmesi işleminin çok sık kullanılacağını da söylemek yanlış olmaz. SQL ile sorgu yazarken tekrarlanarak yapılan hatalardan biri de "between" operatörü kullanılan sorgulardır. Bu sorgular aynı satırın 2 kere getirilmesine yol açabilir.
Aşağıdaki veri üzerinden bir örnek geliştirmek istersek :
orderid
SubTotal
Shipping
OrderTotal
OrderDate
1
100.00
0.00
100.00
2007-12-22 23:06:16.820
2
75.00
5.95
80.95
2007-12-22 23:06:59.787
3
25.00
5.95
30.95
2007-12-22 23:09:18.083
4
50.00
5.95
55.95
2007-12-22 23:13:15.120
5
50.00
5.95
55.95
2007-12-22 23:28:49.860
6
50.00
10.45
60.45
2007-12-22 23:37:44.593
7
200.00
13.70
213.70
2007-12-22 23:56:10.533
8
25.00
5.95
30.95
2007-12-23 00:00:00.000
9
50.00
5.95
55.95
2007-12-23 00:01:19.477
10
50.00
5.95
55.95
2007-12-23 00:08:43.227
Yukarıdaki verileri üreten sql script :
SET NOCOUNT ON DECLARE @Orders TABLE (Orderid int identity primary key, subtotal decimal(18,2), shipping decimal(18,2), Ordertotal decimal(18,2), Orderdate datetime) INSERT INTO @Orders VALUES (100.00, 0.00, 100.00, 'Dec 22 2007 11:06:16:820PM') INSERT INTO @Orders VALUES (75.00, 5.95, 80.95, 'Dec 22 2007 11:06:59:787PM') INSERT INTO @Orders VALUES (25.00, 5.95, 30.95, 'Dec 22 2007 11:09:18:083PM') INSERT INTO @Orders VALUES (50.00, 5.95, 55.95, 'Dec 22 2007 11:13:15:120PM') INSERT INTO @Orders VALUES (50.00, 5.95, 55.95, 'Dec 22 2007 11:28:49:860PM') INSERT INTO @Orders VALUES (50.00, 10.45, 60.45, 'Dec 22 2007 11:37:44:593PM') INSERT INTO @Orders VALUES (200.00, 13.70, 213.70, 'Dec 22 2007 11:56:10:533PM') INSERT INTO @Orders VALUES (25.00, 5.95, 30.95, 'Dec 23 2007 12:00:00:000AM') INSERT INTO @Orders VALUES (50.00, 5.95, 55.95, 'Dec 23 2007 12:01:19:477AM') INSERT INTO @Orders VALUES (50.00, 5.95, 55.95, 'Dec 23 2007 12:08:43:227AM')
Yukarıdaki veriler içerisinden "12/22/2007" tarihine bir filtreleme yapmak isteyelim. Bunun için ilk olarak BETWEEN 12/22/2007 AND 12/22/2007 kullanmayı deneyelim.
DECLARE @Orderdate datetime SET @Orderdate = '2007/12/22' SELECT * FROM @Orders WHERE Orderdate BETWEEN @Orderdate AND @Orderdate --Sonuçlar Orderid subtotal shipping Ordertotal Orderdate -------- --------- --------- ------------ -----------
Görüldüğü gibi yukarıdaki sorgu bize sonuç döndürmedi. Belki DATEADD kullanarak 12/22/2007 ile 12/23/2007 arasındaki verileri elde edebiliriz diyip aşağıdaki sorguyu çalıştıralım :
DECLARE @Orderdate datetime SET @Orderdate = '2007/12/22' SELECT * FROM @Orders WHERE Orderdate BETWEEN @Orderdate AND DATEADD(dd, 1, @Orderdate) -- Sonuçlar Orderid subtotal shipping Ordertotal Orderdate -------- --------- --------- ------------ ----------------------- 1 100.00 0.00 100.00 2007-12-22 23:06:16.820 2 75.00 5.95 80.95 2007-12-22 23:06:59.787 3 25.00 5.95 30.95 2007-12-22 23:09:18.083 4 50.00 5.95 55.95 2007-12-22 23:13:15.120 5 50.00 5.95 55.95 2007-12-22 23:28:49.860 6 50.00 10.45 60.45 2007-12-22 23:37:44.593 7 200.00 13.70 213.70 2007-12-22 23:56:10.533 8 25.00 5.95 30.95 2007-12-23 00:00:00.000 SET @Orderdate = '2007/12/23' SELECT * FROM @Orders WHERE Orderdate BETWEEN @Orderdate AND DATEADD(dd, 1, @Orderdate) -- Sonuçlar
Orderid subtotal shipping Ordertotal Orderdate -------- --------- --------- ------------ ----------------------- 8 25.00 5.95 30.95 2007-12-23 00:00:00.000 9 50.00 5.95 55.95 2007-12-23 00:01:19.477 10 50.00 5.95 55.95 2007-12-23 00:08:43.227Yukarıdaki tabloları incelediğinizde bu sefer de 8 numaralı kaydın her iki sorgu sonucunda da döndürüldüğünü görürüz. İlk yaptığımız örnekte hiç sonuç döndürülmemesinin nedeni string olarak saat kısmı olmadan bir tarih belirttiğimizde bu tarih datetime veri tipine dönüştürülür ve saat kısmı 00:00:00.000 olarak kabul edilir. Bu yüzden ilk sorgu tam olarak 2007-12-23 00:00:00.000 anında yapılan kayıtları döndürür. Ikinci sorgumuza bakacak olursak DATEADD ile eklenen 1 günlük zaman aralığı 8 numaralı kaydın 2 sorguda da getirilmesine neden olmuştur.
Kullanılması gereken en etkin yöntem BETWEEN değil küçüktür-büyüktür(küçük eşit-büyük eşit) operatörleridir. Aşağıdaki örnekte bu operatörleri kullanalım ve sonuçlara bir göz atalım.
DECLARE @Orderdate datetime SET @Orderdate = '2007/12/22' SELECT * FROM @Orders WHERE Orderdate >= @Orderdate AND Orderdate < DATEADD(dd, 1, @Orderdate) -- Sonuçlar
Orderid subtotal shipping Ordertotal Orderdate -------- --------- --------- ------------ ----------------------- 1 100.00 0.00 100.00 2007-12-22 23:06:16.820 2 75.00 5.95 80.95 2007-12-22 23:06:59.787 3 25.00 5.95 30.95 2007-12-22 23:09:18.083 4 50.00 5.95 55.95 2007-12-22 23:13:15.120 5 50.00 5.95 55.95 2007-12-22 23:28:49.860 6 50.00 10.45 60.45 2007-12-22 23:37:44.593 7 200.00 13.70 213.70 2007-12-22 23:56:10.533 SET @Orderdate = '2007/12/23' SELECT * FROM @Orders WHERE Orderdate >= @Orderdate AND Orderdate < DATEADD(dd, 1, @Orderdate) -- Sonuçlar
Orderid subtotal shipping Ordertotal Orderdate -------- --------- --------- ------------ ----------------------- 8 25.00 5.95 30.95 2007-12-23 00:00:00.000 9 50.00 5.95 55.95 2007-12-23 00:01:19.477 10 50.00 5.95 55.95 2007-12-23 00:08:43.227
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
Facebook Üzerinden Takip Et!
Twitter'da Takip Et!
-
01 Şubat 2011 Salı 13:15Moderatör
2) Duplicate(kopya) satırların bulunup silinmesi
Kopya satırların silinmesi işlemi için aşağıdaki tabloyu kullanalım.
Örnek Tablo:
ID
CustName
Pincode
1
Jack
45454
2
Jill
43453
3
Tom
43453
4
Kathy
22343
5
David
65443
6
Kathy
22343
7
Kim
65443
8
Hoggart
33443
9
Kate
61143
10
Kim
65443
İstenen Çıktı: Kopya satırlar kaldırıldıktan sonra
ID
CustName
Pincode
1
Jack
45454
2
Jill
43453
3
Tom
43453
4
Kathy
22343
5
David
65443
7
Kim
65443
8
Hoggart
33443
9
Kate
61143
Örnek tabloyu oluşturacak sql script :
SET NOCOUNT ON -- Tablonun Oluşturulması CREATE TABLE #Customers (ID integer, CustName varchar(20), Pincode int) -- Tablonun örnek veri ile doldurulması INSERT INTO #Customers VALUES (1, 'Jack',45454 ) INSERT INTO #Customers VALUES (2, 'Jill', 43453) INSERT INTO #Customers VALUES (3, 'Tom', 43453) INSERT INTO #Customers VALUES (4, 'Kathy', 22343) INSERT INTO #Customers VALUES (5, 'David', 65443) INSERT INTO #Customers VALUES (6, 'Kathy', 22343) INSERT INTO #Customers VALUES (7, 'Kim', 65443) INSERT INTO #Customers VALUES (8, 'Hoggart', 33443) INSERT INTO #Customers VALUES (9, 'Kate', 61143) INSERT INTO #Customers VALUES (10, 'Kim', 65443)
Öncelikle kopya satırların hangi satırlar olduğunu tanılamak gerekirse yukarıdaki tabloda CustName ve Pincode sütun değerleri aynı olan satırlar kopya satırlardır diyebiliriz. Satır 7 ve 10’u inceleyin. Kim isimli müşteri ve numarası aynı olduğundan bu satırlardan birinin silinmesi işlemini yapacağız. Bu örnekte ID değeri büyük olan satırın silinmesi işlemini gerçekleştirelim.
-- kopya Satırların Bulunması SELECT MAX(ID) as ID, CustName, Pincode FROM #Customers GROUP BY CustName, Pincode HAVING COUNT(*) > 1 -- kopya Satırların Silinmesi DELETE FROM #Customers WHERE ID IN ( SELECT MAX(ID) FROM #Customers GROUP BY CustName, Pincode HAVING COUNT(*) > 1)
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
Facebook Üzerinden Takip Et!
Twitter'da Takip Et!
-
01 Şubat 2011 Salı 13:23Moderatör
3) Veritabanı içerisindeki tüm verinin silinmesi
Kullanıcı veritabanı içerisindeki tüm tablolardan bütün veriyi silmek isteyebilir. Bu gibi durumlarda veritabanı içerisindeki tabloların sayısı çok fazla ise bu işlemi manuel yapmak çok çok daha uzun zaman alacaktır. Hele tablolar arası ilişkilerin falan olacağını da düşünürsek bu işten vazgeçip yeni bir veritabanı oluşturmayı bile düşünebiliriz.
Ancak aşağıdaki saklı yordam(Stored Procedure) ile birlikte tüm tablolardan tüm verilerin silinmesi işlemi yapılmaktadır. Lütfen çok dikkatli kullanın :) Kullanabileceğiniz SQL Server Sürümleri :
2000,2005,2008
CREATE PROCEDURE DeleteAllData AS BEGIN DECLARE @SQL nvarchar(2000), @CurrentTable sysname, @CurrentSchema sysname --Sunucu sürümüne özel değiştirilmesi gereken ifadeleri işlemek için sunucu sürümünü al DECLARE @ServerVersion int SET @ServerVersion = (SELECT CAST(LEFT(CAST(SERVERPROPERTY('ProductVersion') AS varchar(50)), CHARINDEX('.',CAST(SERVERPROPERTY('ProductVersion') AS varchar(50))) - 1) AS int)) --Bu çözümde bir cursor kullanılmıştır.Alternatif olarak sp_msforeachtable saklı yordamı ya da döngü mantığı da kullanılabilir. DECLARE TableCursor SCROLL CURSOR FOR SELECT QUOTENAME(TABLE_SCHEMA) AS schemaname, QUOTENAME(TABLE_NAME) AS name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' OPEN TableCursor FETCH NEXT FROM TableCursor INTO @CurrentSchema, @CurrentTable --Tüm triggerların devre dışı bırakılması WHILE @@FETCH_STATUS = 0 BEGIN --Mevcut tablodaki triggerların devre dışı bırakılması için yazılan sorgu SET @SQL = (SELECT 'ALTER TABLE '+ @CurrentSchema + '.' + @CurrentTable + ' DISABLE TRIGGER ALL') EXECUTE sp_ExecuteSQL @SQL; --Herhangi bir hata oluşma ihtimaline karşı başarılı ya da başarısız uyarı mesajını görüntüleme IF @@ERROR = 0 BEGIN PRINT ‘Triggerlar bu tablolar üzerinde başarı ile etkisizleştirildi ' + @CurrentSchema + '.' + @CurrentTable END ELSE BEGIN PRINT ‘Triggerlar bu tablolar üzerinde etkisizleştirilirken bir hata ile karşılaşıldı' + @CurrentSchema + '.' + @CurrentTable END --Mevcut tablodaki tüm constraint'leri devre dışı bırakma SET @SQL = (SELECT 'ALTER TABLE '+ @CurrentSchema + '.' + @CurrentTable + ' NOCHECK CONSTRAINT ALL') EXECUTE sp_ExecuteSQL @SQL; --Herhangi bir hata oluşma ihtimaline karşı başarılı ya da başarısız uyarı mesajını görüntüleme IF @@ERROR = 0 BEGIN PRINT ‘Constraintler bu tablolar üzerinde başarı ile etkisizleştirildi ' + @CurrentSchema + '.' + @CurrentTable END ELSE BEGIN PRINT ‘Constraint’ler bu tablolar üzerinde etkisizleştirilirken bir hata ile karşılaşıldı ' + @CurrentSchema + '.' + @CurrentTable END --Cursor üzerinden bir sonraki tablonun getirilmesi FETCH NEXT FROM TableCursor INTO @CurrentSchema, @CurrentTable END --Cursor üzerindeki ilk tablonun getirilmesi FETCH FIRST FROM TableCursor INTO @CurrentSchema, @CurrentTable WHILE @@FETCH_STATUS = 0 BEGIN IF @ServerVersion >= 9 --SQL Server 2005 ya da daha üzeri bir versiyon kullanıyorsak TRY CATCH bize çok yardımcı olacaktır. BEGIN SET @SQL = (SELECT 'BEGIN TRY TRUNCATE TABLE ' + @CurrentSchema + '.' + @CurrentTable + ' PRINT Veri başarı ile truncate edildi' + @CurrentSchema + '.' + @CurrentTable + ''' END TRY BEGIN CATCH DELETE FROM ' + @CurrentSchema + '.' + @CurrentTable + ' IF EXISTS(SELECT ''A'' FROM information_schema.columns WHERE COLUMNPROPERTY(OBJECT_ID(''' + @CurrentSchema + '.' + @CurrentTable + '''), column_name,''IsIdentity'')=1 AND QUOTENAME(TABLE_SCHEMA) = ''' + @CurrentSchema + ''' AND QUOTENAME(TABLE_NAME) = ''' + @CurrentTable + ''') BEGIN DBCC CHECKIDENT(''' + @CurrentSchema + '.' + @CurrentTable + ''', RESEED, 0) END PRINT ''Veri başarı ile buradan silindi.' + @CurrentSchema + '.' + @CurrentTable + ''' END CATCH') END ELSE -- SQL Server 2000 üzerindeyiz demektir ve önce ForeignKey olup olmadığına bakalım.. BEGIN SET @SQL = (SELECT 'IF OBJECTPROPERTY(OBJECT_ID(''' + @CurrentSchema + '.' + @CurrentTable + '''), ''TableHasForeignRef'') <> 1 BEGIN TRUNCATE TABLE ' + @CurrentSchema + '.' + @CurrentTable + ' PRINT ''Veri başarıyla truncate edildi' + @CurrentSchema + '.' + @CurrentTable + ''' END ELSE BEGIN DELETE FROM ' + @CurrentSchema + '.' + @CurrentTable + ' IF EXISTS(SELECT ''A'' FROM information_schema.columns WHERE COLUMNPROPERTY(OBJECT_ID(''' + @CurrentSchema + '.' + @CurrentTable + '''), column_name,''IsIdentity'')=1 AND QUOTENAME(TABLE_SCHEMA) = ''' + @CurrentSchema + ''' AND QUOTENAME(TABLE_NAME) = ''' + @CurrentTable + ''') BEGIN DBCC CHECKIDENT(''' + @CurrentSchema + '.' + @CurrentTable + ''', RESEED, 0) END PRINT ''’Veri buradan başarıyla silindi ' + @CurrentSchema + '.' + @CurrentTable + ''' END') END EXECUTE sp_ExecuteSQL @SQL; --Cursor üzerinden bir sonraki tablonun getirilmesi FETCH NEXT FROM TableCursor INTO @CurrentSchema, @CurrentTable END --Cursor üzerinden ilk tablonun getirilmesi FETCH FIRST FROM TableCursor INTO @CurrentSchema, @CurrentTable WHILE @@FETCH_STATUS = 0 BEGIN --Triggerların yeniden kullanılabilir duruma getirilmesi SET @SQL = (SELECT 'ALTER TABLE ' + @CurrentSchema + '.' + @CurrentTable + ' ENABLE TRIGGER ALL') EXECUTE sp_ExecuteSQL @SQL; --Herhangi bir hata oluşma ihtimaline karşı başarılı ya da başarısız uyarı mesajını görüntüleme IF @@ERROR = 0 BEGIN PRINT ‘Triggerlar yeniden aktifleştirildi' + @CurrentSchema + '.' + @CurrentTable END ELSE BEGIN PRINT ‘Triggerlar yeniden aktif hale getirilirken bir hata ile karşılaşıldı ' + @CurrentSchema + '.' + @CurrentTable END --Constraints'lerin tekrar kullanılabilir yapılması SET @SQL = (SELECT 'ALTER TABLE ' + @CurrentSchema + '.' + @CurrentTable + ' CHECK CONSTRAINT ALL') EXECUTE sp_ExecuteSQL @SQL; --Herhangi bir hata oluşma ihtimaline karşı başarılı ya da başarısız uyarı mesajını görüntüleme IF @@ERROR = 0 BEGIN PRINT ‘Constraint’ler başarı ile yeniden aktif edildi ' + @CurrentTable END ELSE BEGIN PRINT 'Constraint’ler aktif hale getirilirken bir hata ile karşılaşıldı' + @CurrentTable END --Cursor üzerinden bir sonraki tablonun getirilmesi FETCH NEXT FROM TableCursor INTO @CurrentSchema, @CurrentTable END --Cursor'u kapat CLOSE TableCursor DEALLOCATE TableCursor END --EXEC DeleteAllData
Notlar :
· Saklı yordam içerisinde öncelikle tetikleyiciler(triggers) ve tablolar arası ilişkiler(constraints) kaldırılmış silme işlemi gerçekleştikten sonra bu yapılar tekrar kurulmuştur.
· Yordam eğer SQL Server 2005 ve daha üzeri bir sürüm kullanıyorsanız TRY CATCH mantığıyla SQL Server 200 kullanıyorsanız OBJECTPROPERTY yardımıyla silme işlemini gerçekleştirir.
· Sadece verilerin silinmesi ile veritabanı ve log dosyalarının boyutları küçülmez,bunun için DBCC SHRINKFILE yapısını incelemelisiniz :
http://msdn.microsoft.com/en-us/library/ms189493.aspx
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
Facebook Üzerinden Takip Et!
Twitter'da Takip Et!
-
01 Şubat 2011 Salı 13:27Moderatör
4) Saklı yordamın (stored procedure) aynı anda sadece 1 kere kullanıldığından emin olmak
Bazı durumlarda bir T-SQL kod bloğunun aynı anda sadece 1 kere çalıştığından emin olmak gerekebilir bu çoğu zaman eşzamanlılık sorunlarının yaşanmaması açısından önemlidir. Uzun süren bir işlem tamamlanmadan önce bir başka sorgunun çalıştırılmamasını isteyebilirsiniz.
Aşağıda önerilen çözüm yöntemi SQL Server 2000 -2005 -2008 sürümlerinde uygulanabilir. Örnekte ayrıca Northwind veritabanı kullanılmıştır.
Sp_getapplock ve sp_releaseapplock adındaki 2 sistem saklı yordamını kullanarak aynı anda sorgunun sadece 1 kere işletildiğinden emin olabiliriz.
Kilitlenebilir bir SQL Sorgusunun oluşturulması :
CREATE PROCEDURE dbo.Employees_U_LastName ( @EmployeeID int, @LastName varchar(20) ) AS BEGIN SET TRANSACTION ISOLATION LEVEL REPEATABLE READ BEGIN TRANSACTION DECLARE @LockResult int EXECUTE @LockResult = sp_getapplock @Resource = 'RepeatableRead_TRANSACTION', @LockMode = 'Exclusive', @LockTimeout = 0 IF @LockResult <> 0 BEGIN ROLLBACK TRANSACTION RAISERROR ( 51001, 16, 1 ) RETURN END --Demo amaçlı 10 saniyelik bekleme süresi WAITFOR DELAY '00:00:10' UPDATE Employees SET LastName = @LastName WHERE EmployeeID = @EmployeeID EXECUTE sp_releaseapplock @Resource = 'RepeatableRead_TRANSACTION' COMMIT TRANSACTION END GO
Daha sonra kilitlenebilen bu saklı yordam çalıştığı sırada başka bir istek gelirse görüntüleyeceğimiz kullanıcı tanımlı özel hata mesajını oluşturalım. (Kullanıcı tanımlı hata mesajları için hata numaraları 50000 ve üzeri verilmelidir.)
USE Northwind GO EXECUTE sp_addmessage @msgnum = 51001, @severity = 16, @msgtext = N'Kaynak Kullanilabilir degil', @lang = 'us_english', @replace = REPLACE
Şimdi uygulamaya geçelim. 2 ayrı Query Windows açalım ve aşağıdaki kodu bu 2 pencereden birine yapıştıralım. Lütfen 2 sorgu penceresine de gerekli kodlar yazılmadan ve veritabanı bağlantıları sağlanmadan kodu çalıştırmayın.
EXECUTE dbo.Employees_U_LastName @EmployeeID = 1, @LastName = 'Davolio-Jones' SELECT EmployeeID, LastName, FirstName FROM Employees WHERE EmployeeID = 1 Aşağıdaki kodu 2. Query Window içerisine kopyalayın : EXECUTE dbo.Employees_U_LastName @EmployeeID = 1, @LastName = 'Davolio' SELECT EmployeeID, LastName, FirstName FROM Employees WHERE EmployeeID = 1
Birinci ekrandaki sorguyu çalıştırın ve hemen ardından 2. Sorgu penceresindeki sorguyu da çalıştırın. 2.Pencerede kendi oluşturmuş olduğumuz hata mesajını göreceksiniz :
Msg 51001, Level 16, State 1, Procedure Employees_U_LastName, Line 21 Kaynak Kullanilabilir Degil
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
Facebook Üzerinden Takip Et!
Twitter'da Takip Et!
-
01 Şubat 2011 Salı 13:29Moderatör
SQL Server'da null değerler ile ilgili işlem yapmak için kullanılabilecek 2 fonksiyon mevcuttur : ISNULL() ve COALESCE() .Geliştiriciler çoğu zaman null değerlerle karşılaştıklarında farklı(varsayılan) değerlerin döndürülmesini isteyebilirler bu yüzden bahsedilen 2 fonksiyon çok kullanışlı olmaktadır.
ISNULL()
ISNULL SQL Server ile built in gelen bir TSQL fonksiyonudur. ANSI-92 Standartlarında tanımlanmış bir fonksiyon değildir anca Microsoft ANSI SQL Standartlarına ek olarak bu fonksiyonu da TSQL dilinde kullanıma sunmuştur.
ISNULL() 2 parametre kabul eder. Ilk parametre değerlendilir eğer bu parametre null ise 2. parametre döndürülür.(2. Parametre null olsun ya da olmasın.) Lütfen aşağıdaki örneği inceleyin :
SELECT ISNULL(NULL, 1) --1 Döndürür SELECT ISNULL(NULL, NULL) --NULL Döndürür
COALESCE()
COALESCE()'de SQL Server ile built in gelen bir TSQL fonksiyonudur. ISNULL() fonksiyonunun aksine COALESCE() ANSI-92 SQL Standartları içerisinde tanımlanmıştır. Coalesce fonksiyonu bir parametre seti içerisinde ilk NULL olmayan değeri döndürür. Bu parametre listesi 2 ya da daha fazla elemandan oluşabilir ve elemanlar farklı veri tiplerinde değerler içeriyor olabilirler. Lütfen aşağıdaki örneği inceleyin :
SELECT COALESCE(NULL, 1) --1 Döndürür SELECT COALESCE(NULL, 3, NULL, 1) --3 Döndürür
ISNULL - COALESCE Karşılaştırması
Aynı sorunu çözen birden fazla metod varsa her zaman hangisi daha iyi sorusu akla gelir. 2 Fonksiyon arasında bazı farklılıklar vardır ve işi tartıya vurursak COALESCE biraz daha ağır basar diye düşünebiliriz.
· COALESCE ANSI-92 Standartlarına uygundur. Eğer yazmış olduğunuz kodu bir başka RDBMS sisteme taşırsanız COALESCE yeniden bir kodlama gerekmeden çalışacaktır.
· COALESCE ikiden fazla parametreyi kabul edebilirken ISNULL ile yalnızca 2 parametre ile çalışabilirsiniz. ISNULL fonksiyonları iç içe kullanılarak bir çözüm oluşturulabilmesine rağmen bu da parametre sayısının fazla olduğu durumlarda kullanışlı değildir.
· ISNULL aldığı parametrelerin türlerini ilk parametrenin türüne bakarak değiştirir yani aşağıdaki sorguyu incelersek ISNULL kullanarak bazen istediğimiz sonuçları alamazken COALESCE ile bu sorunları yaşamayız.
DECLARE @Field1 char(3), @Field2 char(50) SET @Field2 = 'Uzun String' SELECT ISNULL(@Field1, @Field2) --'Uzu'Döndürür SELECT COALESCE(@Field1, @Field2) --'Uzun String' Döndürür
NOT : Diğer durumlarda COALESCE ile de beklenemyen sonuçlar alabilirsiniz. Örneğin integer ve datatime veri tiplerinden 2 veri üzerinde COALESCE uyguladığınızda Colaesce integer verisini datetime olarak cast edecektir.
SELECT COALESCE(5, GETDATE())
5 döndürmeyecek,1900-01-06 00:00:00.000 döndürecektir. (5 datetime olarak cast edilmiştir).
ISNULL : http://msdn.microsoft.com/en-us/library/ms184325.aspx
COALESCE : http://msdn.microsoft.com/en-us/library/ms190349.aspx
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
Facebook Üzerinden Takip Et!
Twitter'da Takip Et!
-
01 Şubat 2011 Salı 13:33Moderatör
6) Bir kolondan virgüllerle ayrılmış liste oluşturma
Bazı durumlarda bir kolon içerisindeki verilerin virgüllerle ayrılmış bir liste olarak görüntülenmesini isteyebilirsiniz. Örnek vermek gerekirse aşağıdaki tabloyu
MemberID
Team
FirstName
1
1
Jim
2
1
Mary
3
1
Bob
4
2
Sue
5
2
Ralph
6
2
Ellen
7
3
Bill
8
3
Linda
Bu şekilde görüntülenmesini isteyebilirsiniz :
Team
Members
1
Bob, Jim, Mary
2
Ellen, Ralph, Sue
3
Bill, Linda
Böyle bir çıktı alabilmek için birden fazla yol vardır öncelikle SQL Server 2005 ve 2008 için daha sonra SQL Server 2000 için çözüm yolları önereceğiz.
Öncelikle 2 örnek için de kullanacağımız veritabanını oluşturalım :
SET NOCOUNT ON CREATE TABLE TeamInfo ( MemberID int IDENTITY, TeamID int, FirstName varchar(50) ) INSERT INTO TeamInfo VALUES ( 1, 'Jim' ) INSERT INTO TeamInfo VALUES ( 1, 'Mary' ) INSERT INTO TeamInfo VALUES ( 1, 'Bob' ) INSERT INTO TeamInfo VALUES ( 2, 'Sue' ) INSERT INTO TeamInfo VALUES ( 2, 'Ralph' ) INSERT INTO TeamInfo VALUES ( 2, 'Ellen' ) INSERT INTO TeamInfo VALUES ( 3, 'Bill' ) INSERT INTO TeamInfo VALUES ( 3, 'Linda' )
SQL Server 2005/2008 Çözümü
SELECT t1.TeamID, MemberList = substring((SELECT ( ', ' + FirstName ) FROM TeamInfo t2 WHERE t1.TeamID = t2.TeamID ORDER BY TeamID, FirstName FOR XML PATH( '' ) ), 3, 1000 )FROM TeamInfo t1 GROUP BY TeamID -- Sonuçlar TeamID MemberList 1 Bob, Jim, Mary 2 Ellen, Ralph, Sue 3 Bill, Linda
SQL Server 2000 Çözümü
CREATE FUNCTION dbo.fnMakeTeamList ( @TeamID int ) RETURNS varchar(1000) AS BEGIN DECLARE @TempTeam table ( Firstname varchar(20) ) DECLARE @TeamList varchar(1000) SET @TeamList = '' INSERT INTO @TempTeam SELECT FirstName FROM TeamInfo WHERE TeamID = @TeamID IF @@ROWCOUNT > 0 UPDATE @TempTeam SET @TeamList = ( @TeamList + FirstName + ', ' ) RETURN substring( @TeamList, 1, ( len( @TeamList ) - 1 )) END SELECT TeamID, MemberList = dbo.fnMakeTeamList( TeamId ) FROM TeamInfo GROUP BY TeamID -- Sonuçlar TeamID MemberList 1 Jim, Mary, Bob 2 Sue, Ralph, Ellen 3 Bill, Linda
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
Facebook Üzerinden Takip Et!
Twitter'da Takip Et!
-
01 Şubat 2011 Salı 13:36Moderatör
7) Verilerin bütününün getirilmesi yerine belirli bir aralıktaki kayıtları getirme
Büyük veritabanları ile çalışıldığında verilerin uygulamaya getirilmesi zaman açısından sorun oluşturabilir. Verinin görüntülenmesinde en sıklıkla kullanılan DataGridView/GridView kontrolleri ile sayfalama yapıldığını düşünelim bir kerede kullanıcıya 10 satır görüntülenecek ise tüm verinin getirilmesi yerine 10'ar 10'ar getirilmesini sağlayacak bir saklı yordam yazarak bu işlem hızlandırılabilir.
SQL Server 2005/2008 için ROW_NUMBER() fonksiyonunu kullanan,SQL Server 2000 için ise bir tablo değişkeninin kullanıldığı T-SQL çözümünü gösteren aşağıdaki örnekleri inceleyelim :
SQL Server 2005/2008 Çözümü :
DECLARE @Start datetime, @End datetime SELECT @Start = 11, @End = 20 ;WITH ObjectsTABLE AS ( SELECT ROW_NUMBER() OVER (ORDER BY name) AS Row, convert(varchar(30), name) as objName, crDate FROM sysobjects ) SELECT objName, CrDate FROM ObjectsTable WHERE Row >= @Start AND Row <= @End /* Sonuçlar objName CrDate ------------------------------ ----------------------- assembly_modules 2007-02-10 00:23:25.353 assembly_references 2007-02-10 00:23:29.183 assembly_types 2007-02-10 00:23:27.870 asymmetric_keys 2007-02-10 00:23:52.917 backup_devices 2007-02-10 00:23:41.870 certificates 2007-02-10 00:23:52.260 check_constraints 2007-02-10 00:23:20.760 CHECK_CONSTRAINTS 2007-02-10 00:27:23.027 COLUMN_DOMAIN_USAGE 2007-02-10 00:27:21.060 COLUMN_PRIVILEGES 2007-02-10 00:27:21.387 */
SQL Server 2000 Çözümü :
DECLARE @Start datetime, @End datetime SELECT @Start = 11, @End = 20 DECLARE @PagingTable TABLE (Row int identity primary key, objName varchar(30), crDate datetime) INSERT INTO @PagingTable (objName, crDate) SELECT convert(varchar(30), name) as objName, crDate FROM sysobjects ORDER BY Name SELECT objName, CrDate FROM @PagingTable WHERE Row >= @Start AND Row <= @End /* Sonuçlar objName CrDate ------------------------------ ----------------------- assembly_modules 2007-02-10 00:23:25.353 assembly_references 2007-02-10 00:23:29.183 assembly_types 2007-02-10 00:23:27.870 asymmetric_keys 2007-02-10 00:23:52.917 backup_devices 2007-02-10 00:23:41.870 certificates 2007-02-10 00:23:52.260 check_constraints 2007-02-10 00:23:20.760 CHECK_CONSTRAINTS 2007-02-10 00:27:23.027 COLUMN_DOMAIN_USAGE 2007-02-10 00:27:21.060 COLUMN_PRIVILEGES 2007-02-10 00:27:21.387 */
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
Facebook Üzerinden Takip Et!
Twitter'da Takip Et!
-
01 Şubat 2011 Salı 13:40Moderatör
8) Her grup için Top N kaydın seçilmesi
Her kategori/grup için çok satırlı verilerin bulunduğu ortamlarda örneğin "her kategoriden en pahalı 2 ürünü" listelemek benzeri işlemlerin yapılması istenebilir. Örnek tablo ve istenen çıktı :
RowID
Category
ID
Description
Price
1
Pot
A1
Small Saucepan
21.50
2
Pot
A2
1 Qt Saucepan
29.95
3
Pot
A3
1.5 Qt Saucepan
33.95
4
Pot
A4
Double Boiler
39.50
5
Pot
A5
Stewpot
49.50
6
Pot
A6
Pressure Cooker
79.95
7
Pan
B1
8" Pie
6.95
8
Pan
B2
8" Sq Cake
7.50
9
Pan
B3
Bundt Cake
12.50
10
Pan
B4
9x12 Brownie
7.95
11
Bowl
C1
Lg Mixing
27.50
12
Bowl
C2
Sm Mixing
17.50
13
Tools
T1
14" Spatula
9.95
RowID
Category
ID
Description
Price
11
Bowl
C1
Lg Mixing
27.50
12
Bowl
C2
Sm Mixing
17.50
9
Pan
B3
Bundt Cake
12.50
10
Pan
B4
9x12 Brownie
7.95
6
Pot
A6
Pressure Cooker
79.95
5
Pot
A5
Stewpot
49.50
13
Tools
T1
14" Spatula
9.95
Önce üzerinde çalışacağımız verileri oluşturalım :
SET NOCOUNT ON DECLARE @MyTable table ( RowID int IDENTITY, Category varchar(5), [ID] varchar(5), [Description] varchar(25), Price decimal(10,2) ) INSERT INTO @MyTable VALUES ( 'Pot', 'A1', 'Small Saucepan', 21.50 ) INSERT INTO @MyTable VALUES ( 'Pot', 'A2', '1 Qt Saucepan', 29.95 ) INSERT INTO @MyTable VALUES ( 'Pot', 'A3', '1.5 Qt Saucepan', 33.95 ) INSERT INTO @MyTable VALUES ( 'Pot', 'A4', 'Double Boiler', 39.50 ) INSERT INTO @MyTable VALUES ( 'Pot', 'A5', 'Stewpot', 49.50 ) INSERT INTO @MyTable VALUES ( 'Pot', 'A6', 'Pressure Cooker', 79.95 ) INSERT INTO @MyTable VALUES ( 'Pan', 'B1', '8"" Pie', 6.95 ) INSERT INTO @MyTable VALUES ( 'Pan', 'B2', '8"" Sq Cake', 7.50 ) INSERT INTO @MyTable VALUES ( 'Pan', 'B3', 'Bundt Cake', 12.50 ) INSERT INTO @MyTable VALUES ( 'Pan', 'B4', '9x12 Brownie', 7.95 ) INSERT INTO @MyTable VALUES ( 'Bowl', 'C1', 'Lg Mixing', 27.50 ) INSERT INTO @MyTable VALUES ( 'Bowl', 'C2', 'Sm Mixing', 17.50 ) INSERT INTO @MyTable VALUES ( 'Tools', 'T1', '14"" Spatula', 9.95 )
SQL Server 2005/2008 Çözümü :
SELECT RowID, Category, [ID], [Description], Price FROM (SELECT ROW_NUMBER() OVER ( PARTITION BY Category ORDER BY Price DESC ) AS 'RowNumber', RowID, Category, [ID], [Description], Price FROM @MyTable ) dt WHERE RowNumber <= 2 -- Sonuçlar RowID Category ID Description Price 11 Bowl C1 Lg Mixing 27.50 12 Bowl C2 Sm Mixing 17.50 9 Pan B3 Bundt Cake 12.50 10 Pan B4 9x12 Brownie 7.95 6 Pot A6 Pressure Cooker 79.95 5 Pot A5 Stewpot 49.50 13 Tools T1 14" Spatula 9.95
SQL Server 2000 Çözümü
SELECT DISTINCT RowID, Category, [ID], [Description], Price FROM @MyTable t1 WHERE RowID IN (SELECT TOP 2 RowID FROM @MyTable t2 WHERE t2.Category = t1.Category ORDER BY Price DESC ) ORDER BY Category, Price DESC -- Sonuçlar RowID Category ID Description Price 11 Bowl C1 Lg Mixing 27.50 12 Bowl C2 Sm Mixing 17.50 9 Pan B3 Bundt Cake 12.50 10 Pan B4 9x12 Brownie 7.95 6 Pot A6 Pressure Cooker 79.95 5 Pot A5 Stewpot 49.50 13 Tools T1 14" Spatula 9.95
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
Facebook Üzerinden Takip Et!
Twitter'da Takip Et!
-
01 Şubat 2011 Salı 13:41Moderatör
9) Tüm kullanıcı tanımlı veritabanlarının detach edilmesi
SET NOCOUNT ON DECLARE @dbName varchar(80), @ServerName varchar(20) SELECT @ServerName = @@servername DECLARE dbCursor CURSOR FOR SELECT name FROM master.dbo.sysdatabases WHERE name NOT IN ( 'model', 'master', 'msdb', 'tempdb', 'distribution', 'repldata' ) OPEN dbCursor FETCH NEXT FROM dbCursor INTO @dbName IF ( @@FETCH_STATUS <> 0 ) PRINT 'Kullanıcı Tanımlı Veritabanı Bulunamadı' WHILE ( @@FETCH_STATUS = 0 ) BEGIN DECLARE @SQLStr varchar(8000) SET @SQLStr = 'DECLARE @SPIDStr varchar(8000), @ConnKilled smallint SELECT @ConnKilled = 0 @SPIDStr = '''' SELECT @SPIDStr = coalesce( @SPIDStr, '', '' ) + ''KILL '' + convert( varchar, spid ) + ''; '' FROM master.dbo.sysprocesses WHERE dbid = db_id( ''' + @dbName + ''' ) IF LEN( @SPIDStr ) > 0 BEGIN EXECUTE( @SPIDStr ) SELECT @ConnKilled = COUNT(1) FROM master..sysprocesses WHERE dbid = db_id( ''' + @dbName + ''' ) END' + char(10) + ';' + char(10) + 'EXECUTE sp_detach_db ' + @dbName EXECUTE ( @SQLStr ) PRINT upper( @dbName ) + ' Veritabanının Detach işlemi sonlandırıldı.' PRINT '' FETCH NEXT FROM dbCursor INTO @dbName END CLOSE dbCursor DEALLOCATE dbCursor PRINT ' ' PRINT upper( @ServerName ) + ' -->Tüm Kullanıcı tanımlı Veritabanları Kaldırıldı'
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
Facebook Üzerinden Takip Et!
Twitter'da Takip Et!
-
01 Şubat 2011 Salı 13:43Moderatör
10) Sunucu üzerindeki veritabanlarının en son yedek alınma tarihini öğrenme
Bir yedek alma işlemi yapıldığında SQL Server msdb.dbo.backupfile, msdb.dbo.backupmediafamily, msdb.dbo.backupmediaset ve msdb.dbo.backupset tablolarını günceller.
Bu tabloları kullanarak veritabanlarınız hakkında bilgi edinebilirsiniz. Aşağıdaki sorgu ile veritabanı ismi en son alınan yedek tarihi ve yedeği kimin aldığı gibi bilgiler listelenmektedir.
SELECT T1.Name as DatabaseName, COALESCE(Convert(varchar(12), MAX(T2.backup_finish_date), 101),'Not Yet Taken') as LastBackUpTaken, COALESCE(Convert(varchar(12), MAX(T2.user_name), 101),'NA') as UserName FROM sys.sysdatabases T1 LEFT OUTER JOIN msdb.dbo.backupset T2 ON T2.database_name = T1.name GROUP BY T1.Name ORDER BY T1.Name
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
Facebook Üzerinden Takip Et!
Twitter'da Takip Et!
-
01 Şubat 2011 Salı 13:47Moderatör
11) En uzun sürede işletilen prosedürlerin bulunması
Çoğu zaman hangi prosedürlerin ya da sorguların Server üzerine en fazla yük bindirdiği bilinmek istenir. Bu yük bazen giriş/çıkış işlemlerinin yükü bazen işlem süresi ile ölçülür.
Aşağıdaki örnekte 10 prosedürün bazı etkenler baz alınarak yapılan karşılaştırması gösterilmiştir.
SQL Server 2005/2008 Çözümü :
SELECT TOP 10 ProcedureName = t.text, ExecutionCount = s.execution_count, AvgExecutionTime = isnull( s.total_elapsed_time / s.execution_count, 0 ), AvgWorkerTime = s.total_worker_time / s.execution_count, TotalWorkerTime = s.total_worker_time, MaxLogicalReads = s.max_logical_reads, MaxLogicalWrites = s.max_logical_writes, CreationDateTime = s.creation_time, CallsPerSecond = isnull( s.execution_count / datediff( second, s.creation_time, getdate()), 0 ) FROM sys.dm_exec_query_stats s CROSS APPLY sys.dm_exec_sql_text( s.sql_handle ) t -- WHERE ... ORDER BY s.total_elapsed_time DESC
Alınan çıktı :
ProcedureName
ExecutionCount
AvgExecutionTime
AvgWorkerTime
TotalWorkerTime
MaxLogicalReads
MaxLogicalWrites
CreationDateTime
CallsPerSecond
Exec Proc1
1
3723204
3596939
3596939
36249
112
2008-03-25 00:04:15.950
0
Exec Proc2
1
2512181
2389573
2389573
703
0
2008-03-24 23:59:15.980
0
Exec Proc3
1
1080008
971041
971041
443
0
2008-03-25 00:16:07.820
0
Exec Proc4
1
1032135
935483
935483
223
0
2008-03-25 00:13:55.193
0
Exec Proc5
1
955338
912818
912818
223
0
2008-03-25 00:15:06.617
0
Exec Proc6
1
946446
906498
906498
346
0
2008-03-25 00:15:33.227
0
Exec Proc7
1
635835
634566
634566
561
0
2008-03-24 23:22:00.280
0
Exec Proc8
1
481766
475023
475023
36202
105
2008-03-25 00:13:55.180
0
Exec Proc9
1
349026
343143
343143
36202
105
2008-03-25 00:15:06.600
0
Exec Proc10
1
346581
337336
337336
36202
105
2008-03-25 00:15:33.227
0
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
Facebook Üzerinden Takip Et!
Twitter'da Takip Et!
-
01 Şubat 2011 Salı 13:50Moderatör
12) Sunucu üzerindeki sabit disklerde kalan boş alanı öğrenme
Disk alanı SQL Server üzerinde birçok faktörden dolayı çoğu zaman en değerli varlıktır. Depolama için Storage Area Network (SAN) Kullanan sunucularda ekstra depolama alanı için yapılacak genişlemeler kolay olabilir ancak bu SAN üzerinde boş alanın olup olmamasına bağlıdır. Direct Attached Storage (DAS) kullanan sunucular üzerinde yapılacak genişlemeler çok daha zor olabilir. Bu durumda sunucunun uzun süre down olması ve var olan disklerin daha genişleri ile değiştirilmesi ya da sunucuya harici bir disk eklenmesi gerekir,bunların hiçbiri genelde maliyeti düşük olan işlemler değildir ve doğru zamanda bu işlemlerin yapılmasını planlamak için DBA'in kalan disk alanını monitor edebilmesi çok önemli bir gereklilik olarak karşımıza çıkar.
İlk olarak kullanılabilecek yöntem xp_fixeddrives komutu. Herhangi bir parametre istemeyen bu komut çalıştırıldığında Mountpoint diskler haricinde harf ile atanan diskler hakkında bilgi alınabilir. Bu komut undocumented bir komut olduğundan ne zamana kadar destekleneceğinin bilinmediğini de unutmamak gerekli.
İkinci olarak SQL Server üzerinde kalan disk alanını belirlemek için COM FileSystemObject sınıfı kullanılarak işletim sistemine çağrılar yapılabilir. Aşağıdaki saklı yordam ile disk üzerindeki boş alan yüzde 15'in altına düştüğünde bilgilendirme yapılması öngörülmüştür. Aşağıdaki kodda değişiklik yaparak bu oranı değiştirebilir alacağınız uyarı mesajını kişiselleştirebilirsiniz.
CREATE PROCEDURE [dbo].[GetDiskSpaceStats] (@RunLocal bit = 0) AS BEGIN IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE name = 'DiskSpaceStats' AND type='U') BEGIN CREATE TABLE [dbo].[DiskSpaceStats] ( DriveLetter char(1), TotalSize decimal(20,0), AvailableBytes decimal(20,0), DriveType char(10), PercentFree decimal(18,3), Report_Date datetime default getdate() ) ON [PRIMARY] END IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE name LIKE '#DiskSpace%') DROP TABLE #DiskSpace CREATE TABLE #DiskSpace ( RowID int Identity Primary Key, DriveLetter char(1), TotalSize decimal(20,0), AvailableBytes decimal(20,0), DriveType char(10), PercentFree decimal(18,3) ) DECLARE @counter int DECLARE @FSOobject int DECLARE @RecordCount int DECLARE @count int DECLARE @string char(35) DECLARE @DriveLetter char(1) DECLARE @TotalSize char(50) DECLARE @AvailableSpace char(50) DECLARE @DriveType char(10) DECLARE @error int DECLARE @hr int DECLARE @src varchar(255), @desc varchar(255) DECLARE @ServerName sysname SET @ServerName = @@ServerName SET @count=0 SET @counter=67 SET @error=0 EXEC @hr = sp_OACreate 'Scripting.FileSystemObject', @FSOobject OUT IF @hr <> 0 BEGIN EXEC sp_OAGetErrorInfo @FSOobject, @src OUT, @desc OUT PRINT @desc RETURN END WHILE @counter < 91 OR @error <3 BEGIN SET @String='Drives.item("'+char(@counter)+'").DriveLetter' EXEC @HR = sp_OAGetProperty @FSOobject, @String, @DriveLetter OUT IF @HR <> 0 BEGIN EXEC sp_OAGetErrorInfo @FSOobject, @src OUT, @desc OUT SELECT @counter=@counter+1 SELECT @error=@error +1 GOTO ErrorPoint END SET @String='Drives.item("'+char(@counter)+'").TotalSize' EXEC @HR = sp_OAGetProperty @FSOobject, @string, @TotalSize OUT IF @HR <> 0 BEGIN EXEC sp_OAGetErrorInfo @FSOobject, @src OUT, @desc OUT SELECT @counter=@counter+100 SELECT @error=1 END SET @String='Drives.item("'+char(@counter)+'").AvailableSpace' EXEC @HR = sp_OAGetProperty @FSOobject, @string, @AvailableSpace OUT IF @HR <> 0 BEGIN EXEC sp_OAGetErrorInfo @FSOobject, @src OUT, @desc OUT PRINT @desc RETURN END SET @String='Drives.item("'+char(@counter)+'").DriveType' EXEC @HR = sp_OAGetProperty @FSOobject, @String, @DriveType OUT IF @HR <> 0 BEGIN EXEC sp_OAGetErrorInfo @FSOobject, @src OUT, @desc OUT PRINT @desc RETURN END IF @Error < 3 BEGIN INSERT INTO #DiskSpace (DriveLetter, TotalSize, AvailableBytes, DriveType, PercentFree) VALUES (@DriveLetter, @TotalSize, @AvailableSpace, @DriveType, (convert(decimal(20,0), @AvailableSpace)/convert(decimal(20,0), @TotalSize))) END SELECT @counter=@counter+1 END ErrorPoint: INSERT INTO [dbo].[DiskSpaceStats] (DriveLetter, TotalSize, AvailableBytes, DriveType, PercentFree) SELECT DriveLetter, TotalSize, AvailableBytes, DriveType, PercentFree FROM #DiskSpace EXEC @hr = sp_OADestroy @FSOobject IF @hr <> 0 BEGIN EXEC sp_OAGetErrorInfo @FSOobject RETURN END IF @RunLocal = 1 BEGIN SELECT * FROM #DiskSpace END ELSE BEGIN DECLARE @Loop int DECLARE @Subject varchar(100) DECLARE @strMsg varchar(4000) SELECT @Subject = 'SQL Monitor Alert: ' + @@servername SELECT @Loop = min(RowID) FROM #DiskSpace WHERE PercentFree <= .15 WHILE @Loop IS NOT NULL BEGIN SELECT @strMsg = convert(char(15),'Drive:') + isnull(DriveLetter, 'Unknown') + char(10) + convert(char(15),'') + convert(varchar, convert(decimal(18,1), PercentFree*100)) + '% free space remaining.'+ char(10) + convert(char(15),'') + char(10) + convert(char(15),'EventTime:') + convert(varchar, getdate()) FROM #DiskSpace WHERE RowID = @Loop EXEC dbo.SendEmailNotification @Subject, @strMsg SELECT @Loop = min(RowID) FROM #DiskSpace WHERE PercentFree <= .15 AND RowID > @Loop END END DROP TABLE #DiskSpace END
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
Facebook Üzerinden Takip Et!
Twitter'da Takip Et!
-
01 Şubat 2011 Salı 13:52Moderatör
13) Veritabanı dosyaları üzerinde kalan boş alanı öğrenme
Veritabanı dosyaları üzerinde kalan boş alanın takip edilmesi bir DBA için çok önemli bir iştir. Veritabanlarından birinin içindeki filegrouplarda boş datafile kalmadıysa ve otomatik büyüme "autogrowth" aktifleştirilmiş ise veritabanına ekstra alan tanımlanana kadarki süreçte birçok hata mesajı ile karşılaşacağınız neredeyse kesindir.
DBA'in veritabanı üzerinde kalan boş alanı monitör etmesinin birçok nedeni vardır. Öncelikle veritabanı üzerindeki verinin artması performansla direk ilişkilidir. Bir başka neden ise boyut planlama olarak gösterilebilir. DBA veritabanı üzerindeki verinin boyutuna bakarak autogrowth değerinin büyüklüğünü önceden planlayabilir böylece birden çok autogrowth işlemi yerine bu işlemin 1 kerede yapılması ya da tam tersi gibi ihtiyaçlar karşılanmış olur.
CREATE PROCEDURE [dbo].[GetFileSpaceStats] (@RunLocal bit = 0) AS BEGIN /* DECLARE @RunLocal bit SET @RUnLocal = 1 */ DECLARE @dbName sysname IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE name = 'FileSpaceStats' AND type='U') BEGIN CREATE TABLE [dbo].[FileSpaceStats] ( Server_Name sysname NOT NULL, dbName sysname NOT NULL, Flag bit NULL, Fileid tinyint NULL, FileGroup sysname NULL, Total_Space decimal(20, 1) NULL, UsedSpace decimal(20, 1) NULL, FreeSpace decimal(20, 1) NULL, FreePct decimal(20, 3) NULL, Name varchar(250) NULL, FileName sysname NULL , Report_Date datetime default getdate() ) --ON PRIMARY END IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE name LIKE '#FileSpaceStats%') BEGIN DROP TABLE #FileSpaceStats END CREATE TABLE #FileSpaceStats ( RowID int IDENTITY PRIMARY KEY, Server_Name sysname NOT NULL, dbName sysname NOT NULL, Flag bit NULL, Fileid tinyint NULL, FileGroup sysname NULL, Total_Space decimal(20, 1) NULL, UsedSpace decimal(20, 1) NULL, FreeSpace decimal(20, 1) NULL, FreePct decimal(20, 3) NULL, Name varchar(2500) NULL, FileName sysname NULL , Report_Date datetime default getdate() ) IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE name LIKE '#DataFileStats%') BEGIN DROP TABLE #DataFileStats END CREATE TABLE #DataFileStats ( RowID int IDENTITY PRIMARY KEY, Flag bit default 0, Fileid tinyint, FileGroup tinyint, TotalExtents dec (20, 1), UsedExtents dec (20, 1), Name varchar(250), FileName sysname ) IF EXISTS (SELECT * FROM tempdb..sysobjects WHERE name LIKE '#LogSpaceStats%') BEGIN DROP TABLE #LogSpaceStats END CREATE TABLE #LogSpaceStats ( RowID int IDENTITY PRIMARY KEY, dbName sysname, Flag bit default 1, Totallogspace dec (20, 1), UsedLogSpace dec (20, 1), Status char(1) ) DECLARE @string sysname DECLARE cur_dbName CURSOR FOR SELECT name FROM master..sysdatabases OPEN cur_dbName FETCH NEXT FROM cur_dbName into @dbName WHILE @@FETCH_Status=0 BEGIN DELETE #DataFileStats SET @string = 'USE [' + @dbName + '] DBCC SHOWFILESTATS WITH NO_INFOMSGS' INSERT INTO #DataFileStats (Fileid, FileGroup, TotalExtents, UsedExtents, Name, FileName) EXEC (@string) INSERT #FileSpaceStats (Server_Name, dbName, Flag, Fileid, FileGroup, Total_Space, UsedSpace, FreeSpace, FreePct, Name, FileName) SELECT @@SERVERNAME, @dbName, Flag, Fileid, FileGroup_Name(FileGroup), (TotalExtents*64/1024), (UsedExtents*64/1024), ((TotalExtents*64/1024)-(UsedExtents*64/1024)), (((TotalExtents*64/1024)-(UsedExtents*64/1024))*100/(TotalExtents*64/1024))/100, Name, FileName FROM #DataFileStats FETCH NEXT FROM cur_dbName into @dbName END CLOSE cur_dbName DEALLOCATE cur_dbName INSERT #LogSpaceStats (dbName, Totallogspace, UsedLogSpace, Status) EXEC ('DBCC sqlperf(logspace) WITH NO_INFOMSGS') INSERT #FileSpaceStats (Server_Name, dbName, Flag, Fileid, FileGroup, Total_Space, UsedSpace, FreeSpace, FreePct, Name, FileName) SELECT @@SERVERNAME, dbName, Flag, 0, 'LOG', Totallogspace, (TotalLogSpace*(UsedLogSpace/100)), (TotalLogSpace-(TotalLogSpace*(UsedLogSpace/100))), (100-UsedLogSpace)/100, dbName+'_Log', dbName+'_Log.ldf' FROM #LogSpaceStats INSERT dbo.FileSpaceStats (Server_Name, dbName, Flag, Fileid, FileGroup, Total_Space, UsedSpace, FreeSpace, FreePct, Name, FileName) SELECT Server_Name, dbName, Flag, Fileid, FileGroup, Total_Space, UsedSpace, FreeSpace, FreePct, Name, FileName FROM #FileSpaceStats IF @RunLocal = 1 BEGIN SELECT * FROM #FileSpaceStats END ELSE BEGIN DECLARE @Loop int DECLARE @Subject varchar(100) DECLARE @strMsg varchar(4000) SELECT @Subject = 'SQL Monitor Alert: ' + @@servername SELECT @Loop = min(RowID) FROM #FileSpaceStats WHERE FreePct <= .10 WHILE @Loop IS NOT NULL BEGIN SELECT @strMsg = convert(char(15),'Database:') + isnull(dbName, 'Unknown') + char(10) + convert(char(15),'FileGroup:') + isnull(FileGroup, 'Unknown') + char(10) + convert(char(15),'FileName:') + isnull(Name, 'Unknown') + char(10) + convert(char(15),'') + convert(varchar, convert(decimal(18,1), FreePct*100)) + '% boş yer bulunmaktadur.'+ char(10) + convert(char(15),'') + char(10) + convert(char(15),'EventTime:') + convert(varchar, getdate()) FROM #FileSpaceStats WHERE RowID = @Loop EXEC dbo.SendEmailNotification @Subject, @strMsg SELECT @Loop = min(RowID) FROM #FileSpaceStats WHERE FreePct <= .10 AND RowID > @Loop END END DROP TABLE #FileSpaceStats DROP TABLE #DataFileStats DROP TABLE #LogSpaceStats END
SP” SendEmailNotification” :
CREATE PROCEDURE [dbo].[SendEmailNotification] @Subject varchar(4000), @Body varchar(4000), @Attachment varchar(4000) = " " AS DECLARE @From varchar(4000) DECLARE @To varchar(4000) SELECT @From = '"SQLMonitor" <monitor@domain.com>', @To = '"SQL DBA" <sqldba@domain.com>' EXECUTE [dbo].[Send_CDOSysMail] @From ,@To ,@Subject ,@Body ,@Attachment
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
Facebook Üzerinden Takip Et!
Twitter'da Takip Et!
- Düzenleyen Emre GunerturkModerator 01 Şubat 2011 Salı 13:58
-
01 Şubat 2011 Salı 13:55Moderatör
14) Devam eden process bilgilerini almak
select SUBSTRING(st.text, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) + 1) AS statement_text, * from sys.dm_exec_requests qs cross apply sys.dm_exec_sql_text(sql_handle) st cross apply sys.dm_exec_query_plan(plan_handle)
Microsoft bu servisi kullanıcılarına yardım etme, Microsoft ürünleri ve teknolojileriyle ilgili bilgi bankasını genişletme amacıyla ücretsiz sunmaktadır.
Bu içerik olduğu gibi benim tarafımdan hazırlanmış olup Microsoft tarafından herhangi gibi bir sorumluluk üstlenildiği anlamına gelmez.
Facebook Üzerinden Takip Et!
Twitter'da Takip Et!
-
20 Ağustos 2011 Cumartesi 11:27
Emre Bey Kolay Gelsin Bi Sorum Olucaktı
4) Saklı yordamın (stored procedure) aynı anda sadece 1 kere kullanıldığından emin olmak
10 sn içinde hata vermek yerine birincisinin bitmesini bekledikten sonra nasıl çalistirabilirm Yada sadece secilen satiri 10 saniyeliğine nasıl kilitleyebilrim
Tesekkurler..
-
21 Aralık 2011 Çarşamba 11:1510 saniyeliğine bende durdurmak isterim ..
firmakurdu.com -
14 Şubat 2012 Salı 09:58faydalı bilgiler sunun herkese teşekkürler.