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:
- Bozulan indeksleri bulup otomatik tamir eden bir kod.
- 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.)
- ...
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.