Vô hiệu hóa kiểm tra lược đồ trên chức năng / Tạo thủ tục lưu trữ


17

Tôi đang cố gắng tự động hóa quy trình thực hiện các thay đổi đối với cơ sở dữ liệu SQL Server 2008 R2. Quá trình tôi đặt vào vị trí giọt và tạo lại các thủ tục và hàm được lưu trữ của tôi, cũng như chạy các tập lệnh để thay đổi các bảng / cột / dữ liệu. Thật không may, một trong các tập lệnh yêu cầu một trong các chức năng được đặt vào vị trí đầu tiên. Nhưng trước tiên tôi không thể chạy tất cả các thay đổi Proc / hàm được lưu trữ vì nó phụ thuộc vào các cột được thêm vào từ các tập lệnh thay đổi bảng / cột / dữ liệu trước tiên.

Tôi đã tự hỏi nếu có thể chạy các thủ tục và hàm được lưu trữ mà không cần SQL Server xác thực các cột được sử dụng trong định nghĩa của hàm / SP? Tôi đã cố gắng tìm kiếm nhưng không thể tìm thấy một điều kiện hoặc lệnh để kích hoạt điều này.


Có vẻ như bạn chỉ cần sắp xếp lại việc tạo đối tượng trong các tập lệnh của mình.
Thomas Stringer

@shark Đó là một kịch bản thay đổi đòi hỏi sự phụ thuộc vào một chức năng đang tồn tại, lúc đó nó không có ... để làm điều đó đòi hỏi phải có sự can thiệp thủ công; Tôi muốn một cái gì đó tự động hơn.
Brian Mains

Câu trả lời:


20

Bạn có thể tạo các thủ tục được lưu trữ tham chiếu các đối tượng chưa tồn tại (ví dụ: bảng và hàm). Bạn không thể tạo các thủ tục được lưu trữ mà các cột tham chiếu chưa tồn tại trong các đối tượng đã tồn tại. Đây là con dao hai lưỡi của độ phân giải tên bị hoãn - SQL Server mang đến cho bạn lợi ích của sự nghi ngờ trong một số trường hợp, nhưng không phải tất cả. Xem ý tưởng của Erland SET STRICT_CHECKS ON;để có được một số ý tưởng về địa điểm này hoạt động và địa điểm mà nó phá vỡ:

http://www.sommarskog.se/strict_checks.html

(Và cách anh ấy thích cực đối lập với những gì bạn đang theo đuổi - bạn muốn cho phép mọi thứ được biên dịch bất kể sự tồn tại và anh ấy muốn kiểm tra từng cột hoặc bảng duy nhất.)

Không có thiết lập như SET DEFERRED_NAME_RESOLUTION OFF;mặc dù nó đã được yêu cầu:

http://connect.microsoft.com/sql/127152

Và không có thiết lập như thế nào IGNORE ALL_RESOLUTION;.


Bạn có thể giải quyết vấn đề này theo một số cách, bao gồm:

(a) sử dụng SQL động trong (các) thủ tục được lưu trữ bị ảnh hưởng.

(b) xây dựng một sơ khai CREATE PROCEDUREkhông có gì trong đó, sau đó chạy phần còn lại của tập lệnh của bạn, sau đó chạy một ALTER PROCEDUREphần có cơ thể thực (về bản chất, triển khai quy trình theo hai giai đoạn).

(c) làm cho công cụ triển khai của bạn thông minh hơn về thứ tự hoạt động. Nếu thay đổi bảng yêu cầu sự hiện diện của hàm, kịch bản những thay đổi đó sẽ kéo dài. Các công cụ so sánh lược đồ như So sánh SQL của RedGate khá tốt về việc tạo tập lệnh cho bạn theo thứ tự phụ thuộc phù hợp. Bạn không đề cập đến công cụ nào bạn đang sử dụng, nhưng nếu nó không làm điều này ...

(d) Martin Smith có một cách giải quyết thú vị ở đây , nhưng tôi chưa chơi với nó.


Wow, Martin Smith hack rất thông minh. Tôi sẽ cảm thấy bẩn khi sử dụng nó bây giờ, nhưng vào đầu những năm 20 tuổi của tôi sẽ có.
John Zabroski

1

Bạn có thể tạo một thủ tục được lưu trữ để xóa hoặc đổi tên đối tượng trong câu hỏi trước và sau đó chạy thủ tục được lưu trữ ban đầu của bạn dưới dạng SQL động. Bằng cách này, bạn không phải viết lại thủ tục được lưu trữ thực tế để sử dụng SQL động.

Mã bên dưới chạy quy trình được lưu trữ tham chiếu các cột chưa tồn tại (Expense_Super_Compare)

IF OBJECT_ID('Expense_Super_Compare_Results', 'U') IS NOT NULL
BEGIN
     EXEC('DROP TABLE Expense_Super_Compare_Results');
END

exec('exec dbo.Expense_Super_Compare');
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.