Tôi có cần một thời gian ngừng hoạt động trên mạng để cập nhật một thủ tục được lưu trữ không? (Do định nghĩa của người dùng đã thay đổi lỗi)


8

Tôi luôn nghĩ rằng việc cập nhật một thủ tục được lưu trữ là điều tôi có thể làm trong khi người dùng đang tích cực sử dụng hệ thống.

Nhưng tôi hiện đang thử nghiệm một bản cập nhật cho một thủ tục được lưu trữ và trong khi một cuộc gọi dài đến sproc đang được thực hiện (nó đã hơn 4 phút trong cuộc gọi), tôi đã cập nhật sproc. (Tôi đã dự định thử một kế hoạch truy vấn khác trong một cửa sổ riêng biệt.)

Khi tôi quay trở lại hoạt động lâu dài, tôi đã gặp lỗi này:

The definition of object 'MySprocName' has changed since it was compiled.

Lỗi này dường như nói rằng bất kỳ sproc nào đang được thực thi tích cực sẽ thất bại nếu định nghĩa của sproc đó được cập nhật. (Tôi nghĩ rằng một khi một sproc bắt đầu chạy, nó sẽ sử dụng kế hoạch đó cho phần còn lại của hoạt động mặc dù có những thay đổi về định nghĩa.)

Điều này có đúng không? Tôi có cần phải có thời gian chết để cập nhật định nghĩa của một sproc không?


3
Là thủ tục lưu trữ gọi một phần của một giao dịch lớn hơn? Liệu nó có bất kỳ mã nào lấy ra các khóa lược đồ trên bất cứ thứ gì không? Về lý thuyết, sự thay đổi chỉ nên bị chặn. Bạn có thể đi vào chi tiết hơn về những gì thủ tục làm và những gì nó là một phần của?
Aaron Bertrand

@aaron Bertrand - đó là một sproc khá lành tính. Nó có một số cuộc gọi hàng đầu chọn. Không có ổ khóa hoặc bất kỳ điều gì khác như thế. Điều duy nhất có ý nghĩa là nó có một số câu lệnh nếu if dựa trên các tham số. Việc chạy truy vấn thực tế thay đổi một chút dựa trên các tham số. Nó được gọi từ một dịch vụ .net.
Núi lửa

2
Một thủ tục khá lành tính, không nên mất bốn phút để chạy. Nó đang làm gì trong suốt thời gian đó?
Aaron Bertrand

Bạn đã thử thay đổi Proc <Proc Name> WITH RECOMPILEchưa? Đây là một tùy chọn cấp thủ tục để đặt thủ tục biên dịch lại sau mỗi lần chạy. Điều này có nghĩa là kế hoạch sẽ luôn được biên dịch lại và do đó tránh các kế hoạch được lưu trong bộ nhớ cache được sử dụng lại.
MarmiK

dba.stackexchange.com/questions/154939/ Google Bạn đã xem câu hỏi này chưa?
k010mb0

Câu trả lời:


1

Đúng, bạn không nên thay đổi một thủ tục được lưu trữ đang hoạt động, bởi vì SQL Server không thích nó.

Đối với việc ngừng hoạt động, vâng, bạn không nên thay đổi các quy trình được lưu trữ thường xuyên sử dụng trong môi trường sản xuất bận rộn trong giờ hoạt động như một cách thực hành tốt nhất.

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.