2015-09-17 11 views
5

Tôi đã kiểm tra nhiều chủ đề bây giờ và tôi không thể tìm thấy câu trả lời cho điều này, và tôi cần phải khá chắc chắn/tự tin rằng tôi chính xác trong giả định điều này trước khi trả lời cho khách hàng.SQL Server có hợp lệ hóa một proc đã lưu trước khi chạy nó không?

vì vậy, như tiêu đề, Máy chủ SQL có xác thực quy trình được lưu trước khi chạy không?

IE: Ngay cả khi tôi có số IF statement sẽ không bao giờ đáp ứng điều kiện nhất định, mã sẽ được kiểm tra và xác thực trước khi chạy?

EDIT: Dưới đây là một ví dụ nhanh:

DECLARE @ParamSource VARCHAR(2) = 'V3' 

IF @ParamSource = 'V1' 
BEGIN 
    --USE LINKED SERVER HERE WHICH THROWS AN ERROR ABOUT CONNECTIONS 
END 

IF @ParamSource = 'V3' 
BEGIN 
    --DO MY ACTUAL CODE 
END 

Tôi sẽ không bao giờ đáp ứng mà điều kiện đầu tiên, nhưng đối với một số lý do, proc lưu trữ của tôi đang cố gắng để xác nhận về thời gian chạy và giữ erroring.

+0

Chúng được xác thực (ít nhất một phần) khi được xây dựng ban đầu, nhưng không phải lúc chạy. Tuy nhiên điều này không đúng đối với SQL động mà không bao giờ được xác thực. Điều này đến từ kinh nghiệm cá nhân, không phải từ bất kỳ tài liệu nào. Tuy nhiên, nếu bạn muốn kiểm tra lý thuyết này, bạn có thể xây dựng một thủ tục được lưu trữ đơn giản dựa vào một bảng thử nghiệm, sau đó loại bỏ một cột khỏi bảng thử nghiệm. Các thủ tục được lưu trữ sẽ vẫn cố gắng để chạy, nhưng sẽ ném một lỗi. – user2366842

+0

@ user2366842- cảm ơn vì đã trả lời ... Lý do tôi cho rằng việc xác nhận hợp lệ hoặc làm điều gì đó dọc theo những dòng này là vì tôi đang trong quá trình thiết lập một môi trường 'Khắc phục thảm họa 'và một trong các câu lệnh IF máy chủ mà tôi không thể kết nối với một số lý do (Nhưng, tôi không bao giờ cần phải đáp ứng điều kiện đó, tôi có thể xóa mã này, nhưng tôi chỉ muốn biết nếu đây là những gì SQL đã làm?) – Mike

+2

Độ phân giải và biên dịch tên trì hoãn: https: //technet.microsoft.com/en-us/library/ms190686(v=sql.105).aspx (liên kết được cập nhật) – Pred

Trả lời

1

Khi một thủ tục được lưu trữ được tạo, nó được biên dịch, có nghĩa là mỗi đối tượng được sử dụng trong một thủ tục lưu sẵn được xác nhận hợp lệ. Đối với tất cả các đối tượng hiện có, bạn cũng cần có quyền truy cập vào chúng. Điều này sẽ tạo ra một kế hoạch thực hiện cho thủ tục được lưu trữ này, và miễn là thủ tục không thay đổi, kế hoạch thực hiện sẽ vẫn hợp lệ. Nếu bất kỳ đối tượng bảng nào được sử dụng trong thủ tục lưu trữ không tồn tại (chỉ bảng, không phải máy chủ được liên kết), thì kế hoạch thực hiện sẽ không được tạo vào thời điểm này, nhưng thủ tục sẽ được tạo nếu không tìm thấy lỗi nào khác.

Trong ví dụ của bạn, bạn cần truy cập vào đối tượng máy chủ được liên kết để tạo quy trình được lưu trữ của bạn. Sau khi tạo, nếu bạn không còn quyền truy cập vào máy chủ được liên kết, thủ tục của bạn sẽ vẫn chạy, nhưng sẽ tạo ra lỗi nếu nó cần truy cập máy chủ được liên kết IF @ParamSource = 'V1'. Tuy nhiên, nếu nó không chạm vào máy chủ được liên kết IF @ParamSource = 'V3', sẽ không có lỗi.

Về cơ bản, điều đó có nghĩa là người dùng tạo quy trình cần phải có quyền truy cập vào máy chủ được liên kết.

+0

Thông tin thêm về biên dịch lại các thủ tục được lưu trữ: [link] (https://technet.microsoft.com/en-us/library/ms190439 (v = sql.105) .aspx) – Philippe

Các vấn đề liên quan