2010-09-14 17 views
116

Tôi gặp sự cố khi thực hiện một chức năng.Quyền EXECUTE đã bị từ chối trên đối tượng 'xxxxxxx', cơ sở dữ liệu 'zzzzzzz', lược đồ 'dbo'

Dưới đây là những gì tôi đã làm:

  1. Tạo một chức năng sử dụng SQL Server Management Studio. Nó đã được tạo thành công.
  2. sau đó tôi đã cố gắng thực hiện các chức năng mới được tạo ra và đây là những gì tôi nhận được:

Việc cho phép EXECUTE đã bị từ chối trên đối tượng 'xxxxxxx, cơ sở dữ liệu 'zzzzzzz', lược đồ 'dbo'.

+0

Tôi đã trả lời trong liên kết này: http://stackoverflow.com/questions/3708759/the-execute-permission-was-denied-on- đối tượng-zzzzzz-cơ sở dữ liệu-xxxxxx-schem/26589377 # 26589377 –

+0

Nếu có vai trò db_owner, người dùng cũng có thể thực hiện (không bằng để cấp exec ...) – hazjack

+0

Tôi gặp lỗi này khi có lỗi cú pháp trong SQL của tôi Tuyên bố. Về cơ bản tôi đã hợp nhất 'GO' và' Create' thành 'GOCreate'. Các lỗi cú pháp khác dường như cũng gây ra lỗi này. –

Trả lời

125

Có vẻ như bạn cần cấp quyền thực thi cho người dùng (hoặc nhóm là một phần của họ) cho quy trình được lưu trữ được đề cập.

Ví dụ, bạn có thể cấp quyền truy cập như sau:

USE zzzzzzz; 
GRANT EXEC ON dbo.xxxxxxx TO PUBLIC 
+2

Xin chào, tôi biết cách đây một chút, nhưng tôi có một câu hỏi. Có thể hành động như vậy có một số vấn đề bảo mật? Liệu nó mở sp được sử dụng cho tất cả mọi người? –

+7

Có, nó cho phép bất kỳ ai có kết nối đến DB để chạy thủ tục được lưu trữ. Tôi mong mọi người lo lắng về an ninh để cấp quyền truy cập cho ** nhóm có liên quan trong * cơ sở dữ liệu * của họ **. –

+7

Bạn cũng có thể sử dụng 'GRANT EXEC TO PUBLIC' để cấp quyền truy cập cho tất cả các đối tượng trong cơ sở dữ liệu – sohaiby

37

bạn cần để chạy một cái gì đó như thế này

GRANT Execute ON [dbo].fnc_whatEver TO [domain\user] 
+2

Đây là những gì tôi cần, nhưng tôi phải làm '[domain \ user]' thay vì ''domain \ user'' –

2

tôi đã phải đối mặt với cùng một vấn đề và tôi giải quyết như cung cấp cho db_owner phép quá cho người sử dụng cơ sở dữ liệu.

+11

tôi không nghĩ đây là giải pháp tốt ... bởi vì tôi không thể cung cấp cho trang web của mình ứng dụng quyền này .. tôi không biết ai lên bầu chọn này –

+6

Không được khuyến cáo, vì điều này rất không an toàn. Bạn nên tạo các vai trò thích hợp thay vì sử dụng db_owner có toàn quyền kiểm soát toàn bộ cơ sở dữ liệu – Yetiish

1

Bạn có thể cung cấp cho tất cả mọi người thực hiện phép:

GRANT Execute on [dbo].your_object to [public] 

"công cộng" là vai trò cơ sở dữ liệu mặc định rằng tất cả người dùng là một thành viên của.

7

Việc cho phép như vậy có thể nguy hiểm, đặc biệt nếu ứng dụng web của bạn sử dụng cùng tên người dùng đó.

Bây giờ, người dùng web (và toàn bộ web trên toàn thế giới) cũng có quyền tạo và thả đối tượng trong cơ sở dữ liệu của bạn. Hãy suy nghĩ SQL Injection!

Tôi khuyên bạn nên cấp Execute đặc quyền chỉ cho người dùng cụ thể về đối tượng nhất định như sau:

grant execute on storedProcedureNameNoquotes to myusernameNoquotes 

Bây giờ myusernameNoquotes người dùng có thể thực hiện storedProcedureNameNoquotes thủ tục mà không cho phép không cần thiết khác để dữ liệu quan trọng của bạn.

1

Nếu bạn thực hiện đặc biệt là người sử dụng này cho một cơ sở dữ liệu cụ thể, thì có lẽ bạn không đặt nó như db_owner trong "sử dụng bản đồ" bất động sản

62

giải pháp tốt nhất mà tôi tìm thấy là tạo ra một vai trò cơ sở dữ liệu mới tức là

CREATE ROLE db_executor; 

và sau đó cấp quyền quản trị vai trò đó.

GRANT EXECUTE TO db_executor; 

Bây giờ khi bạn đi đến các thuộc tính của người sử dụng và đi đến tài Mapping và chọn cơ sở dữ liệu mà bạn đã thêm vai trò mới, bây giờ vai trò mới sẽ được hiển thị trong cơ sở dữ liệu vai trò thành viên cho: phần

For more detail read full article

+2

Câu trả lời này là tốt nhất nếu bạn cần cấp EXECUTE cho tất cả SP cho một người dùng đăng nhập cụ thể - mà không sử dụng công khai hoặc db_owner. Có vẻ như câu trả lời thận trọng và hữu ích nhất ở đây. – jcollum

+1

Vì một số lý do, đây là câu trả lời duy nhất có hiệu quả đối với tôi trên SQL Server 2012. Việc cho phép người dùng rõ ràng quyền EXECUTE của tôi không hoạt động. Nó chỉ hoạt động nếu nó thừa kế quyền thông qua một vai trò. – Keith

44

Trong Sql server:

chỉ cần đi đến security->schema->dbo.

Nhấp đúp vào dbo, sau đó nhấp vào permission tab->(blue font)view database permission và cảm thấy tự do cuộn cho các trường bắt buộc như "execute". Hãy tự mình chọn sử dụng các điều khiển grant hoặc deny. Hy vọng điều này sẽ giúp :)

3

Nếu bạn gặp vấn đề như câu hỏi được yêu cầu ở trên liên quan đến ngoại lệ được giải quyết, sự cố là quyền, không được cấp cho người dùng của nhóm đó để truy cập cơ sở dữ liệu/thủ tục lưu trữ . Tất cả những gì bạn cần làm là làm một cái gì đó giống như những gì tôi có bên dưới, thay thế cho tôi bằng tên cơ sở dữ liệu, thủ tục lưu trữ (chức năng) và loại quyền hoặc vai trò hoặc người bạn cấp quyền truy cập.

USE [StableEmployee] 
GO 
GRANT EXEC ON dbo.GetAllEmployees TO PUBLIC 

/****** Object:. StoredProcedure [dbo] [GetAllEmployees] Script ngày: 2016/01/27 16:27:27 ******/

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER procedure [dbo].[GetAllEmployees] 
as 
Begin 
Select EmployeeId, Name, Gender, City, DepartmentId 
From tblEmployee 

End 
19

Thao tác này sẽ hoạt động nếu bạn đang cố cấp quyền cho Người dùng hoặc vai trò.

Sử dụng Microsoft SQL Server Management Studio:

  1. Go to: Cơ sở dữ liệu
  2. Nhấp chuột phải vào dbo.my_database
  3. Chọn: Thuộc tính
  4. Trên bảng điều khiển phía bên trái, click vào: Quyền
  5. Chọn người dùng hoặc vai trò và trong Bảng điều khiển tên
  6. Tìm Thực hiện quyền và dấu kiểm: Grant, With Grant hoặc Deny
Các vấn đề liên quan