Anasayfa | Hakkımda | Kitaplarım | RSS Site içinde
Kategoriler
» SQL Server 2012
» SQL Server 2008
» C#
» MySQL
» Hayata Dair
» Güncel Haber-Duyuru
» Bir Soru Bir Cevap
» Oracle ve Diğer VTYS
» Java

Cursor'lerle Veritabanı Yönetimsel İşlemlerini Otomatize Etmek

22.12.2008 22:50:47
Belli kriterlere uyan veritabanlarının AUTO_SHRINK özelliğini açmak istiyorum. Nasıl bir yöntem izlemeliyim? (Atıl TORTUMLU, net-sistem.net, İstanbul)

Bir SQL Server veritabanı işletim sisteminden belli miktarda yeri, verilerini kaydetmek için alır. Ancak her zaman aldığı yerin tamamını kullanmayabilir. Bu türden SQL Server'a ait olduğu halde kullanılmayan bir yeri işletim sistemine iade etme işlemine veritabanı SHRINK işlemi denilmekte.

Başlamadan

Cursor'ler hakkında ayrıntılı bilgi için: http://www.verivizyon.com/detail.asp?cid=107(Cursor’lerla Kayıtlara Satır Satır Erişmek)

Çözüm

Net-Sistem.net'ten Atıl, bu problemi iletti ama aslında tekrardan kendisi çözdü. Çözümü burada paylaşmak istedik:

1.Belli şarta uyan veritabanlarını listeleyen bir SELECT ifadesi:

SELECT * FROM sysdatabases WHERE filename LIKE 'd:\sqlServer\Data\secretProject%'

2.Bu ifade sonucunda dönen her bir satır için veritabanında ayrı işlem yapmak üzere bir CURSOR tanımlamak:

DECLARE crTamirat CURSOR FOR
SELECT * FROM sysdatabases WHERE filename LIKE 'd:\sqlServer\Data\secretProject%';

DECLARE @veritabaniIsmi VARCHAR(50);
-- ve bu da cursor'den dönecek değerleri tutmak için bir değişken

3. Cursor'ün açılması ve her bir satır için shrink ayarlamasının yapılması:

DECLARE crTamirat CURSOR FOR
SELECT * FROM sysdatabases WHERE filename LIKE 'd:\sqlServer\Data\secretProject%';

DECLARE @veritabaniIsmi VARCHAR(50);

OPEN  crTamirat 
FETCH NEXT FROM crTamirat INTO @veritabaniIsmi;
WHILE @@FETCH_STATUS=0
BEGIN
      PRINT('ALTER DATABASE ['+@veritabaniIsmi+'] SET AUTO_SHRINK ON WITH NO_WAIT ifadesi çalıştırılıyor....');
      EXEC('ALTER DATABASE ['+@veritabaniIsmi+'] SET AUTO_SHRINK ON WITH NO_WAIT');
      FETCH NEXT FROM crTamirat INTO @veritabaniIsmi;
END


-- son olarak cursor'ün kapatılması ve hafızanın iade işlemleri.
CLOSE crTamirat 
DEALLOCATE crTamirat 

Görüldüğü gibi işlem oldukça basit. Bu şablon kullanılarak ufak tefek değişiklikler ile yapılabilecek bir kaç işlemi şu şekilde sıralayabiliriz:

  1. Bozulan indeksleri bulup otomatik tamir eden bir kod.
  2. Bir veritabanın belli türden sütunları için yapılacak işlemler. (Örneğin karakter dönüşümü, belli karakterlerin elden geçirilmesi, aranması vs.)
  3. ...

Bu bölüm altında bundan böyle, sizlerden gelen değerli problemler ve çözümlerini paylaşmayı planlıyorum. Katkılarından dolayı Atıl'a teşekkürler.

Yorumlar

Abdullah Çataklı yorumladı(31.12.2008 13:40:01)
Bu işlem cursor açmadanda yapılabilirdi.
cursor işi biraz uzatmış. EXEC dbo.sp_MSforeachdb @command1 = 'ALTER DATABASE ? SET AUTO_SHRINK ON WITH NO_WAIT ' bir seferde tüm veritabanlarında sırayla çalıştırılır. veritabanı adı "?" karakteriyle dinamik hale getirilir.


Yaşar Gözüdeli yorumladı(14.01.2009 00:00:34)
Daha genel kullanım
Abdullahcığım, 1.Önerdiğin yöntem sadece DB başına işlem yapılacaksa geçerli bir durum, daha genel bir çözüm bulmak için bu kadar takla attık :) 2. MS_foreachdb gibi spesifik bir SP'yi bilmek için adımızı Abdullah yapmamız veya BOL'u bir kaç kez devirmemiz lazım :) Selamlar...



Konuya müdahil olmak ister misiniz?
Başlık:  
İsim  :  
URL   :
Yorum