Mematikan menyusut otomatis pada semua database SQL Server. Mengapa ini tidak berhasil?

8

Saya pikir saya bisa menggunakan sp_MSforeachdb untuk menyelesaikan masalah ini, tetapi saya mendapatkan pesan kesalahan.

sp_MSforeachdb '
BEGIN
USE [?]
DECLARE @dbid INT
SET @dbid = DB_ID()
IF(@dbid > 4)
BEGIN
    --PRINT ''[?]'' + CONVERT(VARCHAR, @dbid)
    --ALTER DATABASE [?] SET AUTO_SHRINK OFF
END
END;
'

Jika saya menjalankan kueri di atas dengan garis CETAK uncommented, saya mendapatkan daftar semua basis data kecuali basis data sistem. Namun, ketika saya batalkan komentar pada baris ALTER DATABASE, saya mendapatkan dua pesan kesalahan ini:

Msg 5058, Level 16, State 2, Line 9
Opsi 'AUTO_SHRINK' tidak dapat diatur dalam database 'master'.
Msg 5058, Level 16,
Status 1, Baris 9 Opsi 'AUTO_SHRINK' tidak dapat diatur dalam database 'tempdb'.

Ini tampaknya menghentikan operasi di beberapa titik, sehingga hanya beberapa database yang otomatis dinonaktifkan.

Adakah yang tahu bagaimana saya bisa menonaktifkan menyusut otomatis pada semua database? Pertanyaan bonus: mengapa pendekatan saya tidak berhasil?

Petter Brodin
sumber

Jawaban:

7

Sayangnya, prosedur sp_MSforeachdb adalah dan akan selalu tidak didukung dan dengan demikian, agak tidak dapat diandalkan.

Ada artikel di CodeProject yang menunjukkan cara memfilter basis data saat menggunakan DB ini. Tetapi saya memiliki masalah yang sama dengan Anda pada instalasi 2008 R2 lokal saya. Pemfilteran tidak berfungsi.

Teman kami sendiri, Aaron, menulis artikel yang bagus beberapa waktu lalu, tentang menulis versi sp_MSforeachdb yang berbeda dan lebih baik. Lihat artikelnya di sini . Gunakan SP itu dan parameter penyaringan akan melakukan apa yang Anda butuhkan.

Marian
sumber
Itu bekerja seperti pesona, dan bahkan memiliki contoh untuk apa yang ingin saya capai. Terima kasih banyak!
Petter Brodin
3
Lebih baik kita berterima kasih pada Aaron :-). Dia membuat skrip, saya hanya melakukan pencarian cepat untuk itu. Katakanlah dalam kasus ini saya adalah indeks NC yang menunjuk ke data daun indeks berkerumun, dan dia adalah indeks berkerumun itu sendiri :-).
Marian
1
Saya setuju! Tetapi tanpa pengindeksan yang tepat, menemukan data yang tepat bisa menjadi terlalu menuntut;)
Petter Brodin
-1

meskipun ini dijawab, saya hanya akan lebih baik untuk menjatuhkan sedikit baris kode ini yang melakukan penyaringan yang paling diinginkan dan setel AUTO_SHRINK OFF:

EXECUTE sp_MSforeachdb 'IF (''?'' NOT IN (''master'', ''tempdb'', ''msdb'', ''model'')) EXECUTE (''ALTER database ? SET AUTO_SHRINK OFF'')
Gomibushi
sumber