Quyền EXECUTE bị từ chối trên các loại bảng do người dùng xác định?


87

Tôi có câu hỏi về Các loại bảng do người dùng xác định trong SQL Server 2008.

Đối với nhu cầu của một trong các ứng dụng ASP.NET, chúng tôi đã xác định các kiểu bảng của riêng mình trên SQL Server 2008 để sử dụng chúng làm tham số trong các thủ tục được lưu trữ (khi thực hiện lệnh sql trong ứng dụng ASP.NET, chúng tôi chuyển đối tượng DataTable làm tham số cho thủ tục được lưu trữ xem ví dụ ở đây )

Vấn đề là khi chúng tôi chạy lệnh Sql (thực hiện thủ tục được lưu trữ) từ ASP.NET, chúng tôi gặp lỗi:

Quyền EXECUTE đã bị từ chối trên đối tượng 'ourTableType', cơ sở dữ liệu 'ourDatabase', giản đồ 'ourSchema'.

Tại sao lại như vậy? Tại sao chúng ta cần đặt quyền trên các loại bảng do người dùng xác định? Tại sao chỉ đặt quyền trên thủ tục được lưu trữ sử dụng nó là không đủ? Và nếu chúng ta phải thiết lập nó không có vấn đề gì, tại sao không có EXECUTEloại phép thiết lập trong cửa sổ thuộc tính nào (tôi có thể thấy chỉ Control, References, Take Ownership, View Definition)?

Điều tôi cũng không hiểu là việc thiết lập quyền Controltrong cửa sổ thuộc tính sẽ giải quyết được vấn đề và thủ tục được lưu trữ sẽ chạy mà không gặp vấn đề gì.



cảm ơn bạn! Tôi đã tìm kiếm nhưng rõ ràng không đủ tốt: /
Janez

Hãy thử đặt AS dboở cuối. Như thế này: GRANT EXEC ON TYPE::[schema].[typename] TO [User] AS dbo. Đã làm cho tôi.
Jonathan

Câu trả lời:


197

Tôi thực sự hy vọng bạn đã giải quyết được vấn đề này vào lúc này, vì câu hỏi đã gần 4 tháng, nhưng trong trường hợp bạn chưa giải quyết được, đây là những gì tôi nghĩ là câu trả lời.

GRANT EXEC ON TYPE::[schema].[typename] TO [User]
GO

9
2 xu của tôi: Tùy thuộc vào cơ chế xác thực kết nối của bạn, bạn có thể phải cấp điều hành cho nhóm Công khai. Vì vậy, khoản trợ cấp của bạn sẽ giống như sau: CẤP THỰC HIỆN TRÊN LOẠI :: [lược đồ]. [Typename] ĐẾN [Công khai] ĐI
Sudhanshu Mishra

@dotnetguy cảm ơn bạn rất nhiều, không có giải pháp nào phù hợp với tôi ngoài giải pháp của bạn.
Mazen el Senih

3

Nếu thủ tục được lưu trữ của bạn đang sử dụng sql động, nghĩa là thủ tục được @sqltạo và sau đó được thực thi thông qua exec @sql, bạn sẽ cần được cấp quyền trên các bảng bên dưới.

Một công việc xung quanh là sửa đổi thủ tục được lưu trữ để chạy với tư cách người dùng khác . Nếu bạn làm cho nó chạy dưới dạng TỰ CHỌN, nó sẽ chạy bên dưới người tạo ra proc được lưu trữ, điều này cực kỳ nguy hiểm. Tuy nhiên, nếu bạn không có lựa chọn nào khác:

CREATE PROCEDURE dbo.usp_Demo
WITH EXECUTE AS SELF

1
Thx đã chỉ ra điều này. Nhưng thủ tục được lưu trữ không có bất kỳ sql động nào trong đó. Chỉ các INSERT INTOcâu lệnh chung và bảng ´UPDATE´ mà người dùng này có tất cả các quyền mà họ cần. Ngoài ra, người dùng / đăng nhập này được dành riêng / tạo riêng cho ứng dụng ASP.NET này để có thể kết nối với cơ sở dữ liệu này và chỉ thực thi các thủ tục được lưu trữ (không phải tạo, v.v., luôn luôn là người tạo 'sa').
Janez

Cảm ơn, đó là vấn đề đối với tôi. Những người đọc khác gặp sự cố này có thể tham khảo Quyền máy chủ SQL trên Procs được lưu trữ với SQL động để biết thêm mẹo.
Nickolay
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.