Tắt tự động thu nhỏ trên tất cả các cơ sở dữ liệu SQL Server. Tại sao điều này không làm việc?


8

Tôi hình dung tôi có thể sử dụng sp_MSforeachdb để giải quyết vấn đề này, nhưng tôi nhận được thông báo lỗi.

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;
'

Nếu tôi chạy truy vấn trên với dòng PRINT không bị lỗi, tôi nhận được một danh sách tất cả các cơ sở dữ liệu ngoại trừ cơ sở dữ liệu hệ thống. Tuy nhiên, khi tôi bỏ ghi chú dòng ALTER DATABASE, tôi nhận được hai thông báo lỗi sau:

Msg 5058, Cấp 16, Trạng thái 2, Dòng 9
Tùy chọn 'AUTO_SHRINK' không thể được đặt trong cơ sở dữ liệu 'chính'.
Msg 5058, Cấp 16, Trạng thái 1, Dòng 9
Tùy chọn 'AUTO_SHRINK' không thể được đặt trong cơ sở dữ liệu 'tempdb'.

Điều này dường như phá vỡ hoạt động tại một số điểm, do đó chỉ một số cơ sở dữ liệu bị tự động thu nhỏ.

Bất kỳ ý tưởng làm thế nào tôi có thể vô hiệu hóa tự động thu nhỏ trên tất cả các cơ sở dữ liệu? Câu hỏi thưởng: tại sao cách tiếp cận của tôi không hiệu quả?

Câu trả lời:


7

Thật không may, thủ tục sp_MSforeachdb đang và sẽ luôn không được hỗ trợ và do đó, loại không đáng tin cậy.

Có một bài viết về CodeProject chỉ ra cách lọc cơ sở dữ liệu khi sử dụng DB này. Nhưng tôi có vấn đề tương tự như của bạn khi cài đặt 2008 R2 cục bộ. Lọc không hoạt động.

Aaron, người bạn của chúng ta, đã viết một bài báo hay trước đây, về việc viết một phiên bản khác và tốt hơn của sp_MSforeachdb. Xem bài viết của anh ấy ở đây . Sử dụng SP đó và các tham số lọc sẽ làm những gì bạn cần.


Điều đó làm việc như một cơ duyên, và nó thậm chí còn có một ví dụ cho những gì tôi dự định thực hiện. Cảm ơn rất nhiều!
Petter Brodin

3
Chúng tôi tốt hơn cảm ơn Aaron :-). Anh ấy làm kịch bản, tôi chỉ cần tìm kiếm nhanh thôi. Giả sử trong trường hợp này, tôi là một chỉ mục NC trỏ đến dữ liệu lá chỉ mục được nhóm và chính anh ta là chỉ mục được nhóm :-).
Mary

1
Tôi đồng ý! Nhưng nếu không lập chỉ mục thích hợp, việc tìm kiếm dữ liệu phù hợp có thể trở nên quá khắt khe;)
Petter Brodin

-1

mặc dù điều này đã được trả lời nhưng tôi sẽ rất vui khi bỏ dòng mã nhỏ này thực hiện chính xác bộ lọc mà hầu hết mọi người muốn và đặt AUTO_SHRINK TẮT:

EXECUTE sp_MSforeachdb 'IF (''?'' NOT IN (''master'', ''tempdb'', ''msdb'', ''model'')) EXECUTE (''ALTER database ? SET AUTO_SHRINK OFF'')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.