2010-02-11 6 views
17

tôi nhận được lỗi sau khi gọi một thủ tục lưu trữ mà có một tham số có giá trị bảng là một trong những thông sốBảng tham số có giá trị trong một thủ tục lưu trữ được thực hiện quyền từ chối lỗi

Việc cho phép EXECUTE đã bị từ chối trên đối tượng 'ValidationErrors '

ValidationErrors là một TVP tạo ra với các tuyên bố sau:

CREATE TYPE [dbo].[ValidationErrors] AS TABLE(
    [ErrorMessage] [varchar](255) NOT NULL 
) 

người dùng thực hiện các thủ tục lưu trữ có thực hiện ưu đãi về thủ tục lưu trữ. Tuy nhiên, tôi vẫn nhận được lỗi trên. Bất kỳ ý tưởng nào?

Trả lời

32

Tôi nghĩ bạn cũng có thể cần phải cấp quyền người dùng cho loại.

Tham khảo cấp quyền truy cập vào các loại:
SQL 2005
SQL 2008

Cập nhật:
Re: tại sao bạn phải cấp quyền truy cập vào loại khi bạn có quyền truy cập vào các sproc. Tôi không biết lý do dứt khoát, nhưng BOL nói:

Không giống như kiểu do người dùng định nghĩa được tạo ra bởi sử dụng sp_addtype, cơ sở dữ liệu công vai trò không tự động cấp THAM KHẢO phép trên các loại mà được tạo ra bởi bằng cách sử dụng CREATE TYPE. Quyền này cần được cấp riêng cho các cá nhân có quyền .

Cập nhật 2: cấp EXECUTE quyền, bạn muốn chạy trong SSMS:

GRANT EXECUTE ON TYPE::dbo.ValidationErrors TO SomeUser; 
+0

Tôi đã cấp quyền "kiểm soát" cho đối tượng và dường như nó hoạt động tốt ngay bây giờ. Chỉ cần thêm "tham chiếu" và "định nghĩa chế độ xem" không giúp được gì. Cá nhân, tôi không hiểu yêu cầu vì nó là một kiểu và thường khi thực hiện thủ tục lưu trữ được cấp, các đối tượng tham chiếu không cần quyền cụ thể để được cấp. Tuy nhiên, điều này có thể có liên quan đến thực tế là người dùng ở trong vai trò "công khai". Bất kỳ suy nghĩ nào? – chiefbrownbotom

+0

Bạn đã thử cấp quyền EXECUTE (thay vì kiểm soát)? Có thể có giá trị cố gắng mà trước khi sử dụng để kiểm soát – AdaTheDev

+2

Tôi thấy không có nơi để cấp thực hiện từ các studio quản lý sql. Tôi chỉ thấy những cái tôi liệt kê ở trên. Tôi có phải sử dụng t-sql để cấp điều này không? – chiefbrownbotom

2

Như @chiefbrownbotom nói, lý do tại sao bạn cần thực hiện quyền vào loại bảng là bảng được tạo trước (và do đó bên ngoài) cuộc gọi tới proc. Để minh họa điều này chạy một dấu vết SQL Profiler và gọi proc của bạn. Bạn sẽ thấy một cái gì đó như thế này mà có thể làm bạn ngạc nhiên ...

DECLARE @p1 TABLE AS YourTableType 
INSERT INTO @p1 (col1, col2, col3) VALUES ('val1','val2','val3') 
INSERT INTO @p1 (col1, col2, col3) VALUES ('val1','val2','val3') 
... 
EXEC usp_YourStoredProc @p1 
1

Grant kiểm soát trên LOẠI :: schema.mytabletype để RoleOrMember

này làm việc cho tôi; nhiều nhờ @chiefbrownbotom trong bình luận ở trên.