Trong SQL Server, mục đích của việc nhóm các thủ tục được lưu trữ là gì?


35

Một trong những vấn đề rắc rối nhất mà tôi phải giải quyết là liên quan đến các nhóm Thủ tục được lưu trữ. Đưa ra một thủ tục được lưu trữ usp_DoSomethingAwesome, tôi có thể tạo Proc đó trong một nhóm khác bằng cách gọi nó usp_DoSomethingAwesome;2.

Tôi đã phát hiện ra điều này khi khắc phục sự cố một số vấn đề sao chép (Nhà xuất bản: SQL 2000 Ent., Dist / Sub: 2008 R2 Ent.) Phát sinh với một số quy trình lưu trữ Chèn, Cập nhật và Xóa sao chép do hệ thống tạo.

Mục đích / suy nghĩ đằng sau việc có khả năng "nhóm" này là gì?

Câu trả lời:


32

Điều này giống như quá tải một phương pháp. Về cơ bản, bạn có thể tạo hai hoặc nhiều phiên bản của quy trình được lưu trữ của mình, trong đó mỗi phiên bản thực hiện những việc khác nhau - lấy một số tham số khác nhau, hoạt động trên các bảng khác nhau, có đầu ra khác nhau, v.v.

Chúng được gọi là Thủ tục đánh số và chúng hoàn toàn không được chấp nhận ( công bố từ năm 2005 ). Chúng vẫn được hỗ trợ trong SQL Server 2012, nhưng một số tính năng không chơi tốt với chúng. Ví dụ: chúng được coi là vi phạm ngăn chặn trong Cơ sở dữ liệu có chứa và mọi thủ tục được đánh số> 1 sẽ không được tạo:

Msg 12829, Cấp 16, Trạng thái 1, Quy trình trắng, Dòng 1
Quy trình được lưu trữ 'dbo.blat' đề cập đến một nhóm các thủ tục được lưu trữ được đánh số. Các thủ tục lưu trữ được đánh số không có sẵn trong cơ sở dữ liệu chứa. Vui lòng tham khảo chủ đề Sách trực tuyến Hiểu cơ sở dữ liệu có chứa để biết thêm thông tin về cơ sở dữ liệu chứa.


5

Khả năng (không dùng nữa) để nhóm Thủ tục lưu trữ dường như tồn tại cho một mục đích duy nhất (và khá ngớ ngẩn): khả năng xóa hàng loạt thông qua một DROPtuyên bố. Theo tài liệu SQL Server 2000 MSDN để tạo thủ tục lưu trữ :

Nhóm
Một thủ tục có thể được tạo với cùng tên với một thủ tục được lưu trữ hiện có nếu nó được cung cấp một số nhận dạng khác nhau, cho phép các thủ tục được nhóm một cách hợp lý. Các thủ tục nhóm có cùng tên cho phép chúng bị xóa cùng một lúc. Các thủ tục được sử dụng trong cùng một ứng dụng thường được nhóm theo cách này. Ví dụ: các quy trình được sử dụng với ứng dụng my_app có thể được đặt tên là my_proc; 1, my_proc; 2 , v.v. Xóa my_proc sẽ xóa toàn bộ nhóm. Sau khi các thủ tục đã được nhóm, các thủ tục cá nhân trong nhóm không thể bị xóa.

Không có lợi ích bổ sung nào cho việc sử dụng cấu trúc này do việc sử dụng cùng tên cơ sở thậm chí không cho phép quá tải (chữ ký không cần phải là duy nhất và không có định tuyến thực thi tự động đến một "số" cụ thể) và vì vậy bạn vẫn cần phải sử dụng "số" khi thực hiện. Do đó, việc xác định "ngớ ngẩn" (và điều đó có lẽ là quá tốt đẹp về nó ;-).

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.