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


187

Tôi đang gặp vấn đề khi thực hiện một chức năng.

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

  1. Tạo một hàm bằng SQL Server Management Studio. Nó đã được tạo thành công.
  2. Sau đó tôi đã thử thực hiện chức năng mới được tạo và đây là những gì tôi nhận được:

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


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

Tôi đã gặp lỗi này khi có lỗi cú pháp trong Câu lệnh SQL của tôi. Chủ yếu tôi đã hợp nhất GOCreatethành GOCreate. Các lỗi cú pháp khác dường như cũng đưa ra lỗi này.
Ganesh Kamath - 'Code Frenzy'

Câu trả lời:


162

Âm thanh như bạn cần cấp quyền thực thi cho người dùng (hoặc một nhóm mà họ là một phần) cho thủ tục được lưu trữ trong câu hỏi.

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

USE zzzzzzz;
GRANT EXEC ON dbo.xxxxxxx TO PUBLIC

2
Xin chào, tôi biết đó là một chút thời gian trước đây, 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? Nó mở sp để được sử dụng cho tất cả mọi người?
Valentyn Vynogradskiy

9
Có, nó cho phép bất cứ ai có kết nối với DB chạy thủ tục được lưu trữ. Tôi hy vọng mọi người lo lắng về bảo mật sẽ cấp quyền truy cập vào nhóm có liên quan trong cơ sở dữ liệu của họ .
Rowland Shaw

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

2
Tôi sẽ không bao giờ cấp quyền thực thi cho vai trò công cộng. Bất kỳ cách nào trong môi trường của chúng tôi, nó đã được ủy quyền rằng vai trò công cộng bị vô hiệu hóa. Tôi luôn cấp quyền thực thi cho một người dùng cụ thể hoặc một vai trò được tạo rõ ràng cho mục đích này.
dùng1161391

4
Tại sao tất cả mọi người đều ủng hộ các ý kiến ​​đề nghị trao quyền CÔNG KHAI để thực thi bất cứ điều gì trong cơ sở dữ liệu? Đó là một trường hợp đặc biệt không phải là defacto.
Sat Thiru

111

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

CREATE ROLE db_executor;

và sau đó cấp quyền thực thi 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 dùng và đi tới Ánh xạ người dùng và chọn cơ sở dữ liệu nơi bạn đã thêm vai trò mới, giờ đây vai trò mới sẽ hiển thị trong phần thành viên vai trò Cơ sở dữ liệu cho:

Để biết thêm chi tiết đọc toàn bộ bài viết


8
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ả các SP cho một lần đăng nhập người dùng cụ thể - mà không cần sử dụng công khai hoặc db_owner. Có vẻ như câu trả lời khôn ngoan 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 phù hợp với tôi trên SQL Server 2012. Cung cấp cho người dùng quyền EXECUTE rõ ràng của tôi không hoạt động. Nó chỉ hoạt động nếu nó kế thừa sự cho phép thông qua một vai trò.
Keith

1
Đây nên là câu trả lời. Nó làm việc như một cơ duyên đối với tôi. Cảm ơn rất nhiều!
Shahbaaz

Sau đó thêm nó vào tài khoản, chẳng hạn nhưEXEC sp_addrolemember @rolename = N'db_executor', @membername = N'processAPI'
egamegaMan

72

Trong Studio quản lý máy chủ Sql:

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

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


52

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

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

4
Đây là những gì tôi cần, nhưng tôi phải làm [domain\user]hơn là'domain\user'
Paul Stephenson

45

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

Sử dụng Microsoft SQL Server Management Studio:

  1. Truy cập: 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 bên trái, nhấp vào: Quyền
  5. Chọn Người dùng hoặc Vai trò và trong Bảng tên
  6. Tìm Thực thi trong quyền và đánh dấu: Grant, With Grant hoặc Deny

Thật không may, người dùng đã thực thi quyền! Đó là lý do tại sao điều này rất khó hiểu ....
Douglas Gaskell

Cảm ơn Keim, nó hoạt động hoàn hảo khi tôi đánh dấu Grant
Rosh

16

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ả các đối tượng trong cơ sở dữ liệu của bạn. Hãy suy nghĩ SQL tiêm!

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

grant execute on storedProcedureNameNoquotes to myusernameNoquotes

Bây giờ người dùng myusernameNoquotes có thể thực thi thủ tục được lưu trữProcedureNameNoquotes mà không cần các quyền không cần thiết khác đối với dữ liệu có giá trị của bạn.



3

Nếu bạn có các vấn đề như câu hỏi ở trên liên quan đến ngoại lệ được ném khi giải pháp được thực thi, thì vấn đề là sự cho phép, không được cấp đúng cho người dùng của nhóm đó để truy cập cơ sở dữ liệu / thủ tục đượ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ế tên của tôi bằng tên cơ sở dữ liệu của bạn, các thủ tục được lưu trữ (chức năng) và loại quyền hoặc vai trò hoặc người mà bạn đang cấp quyền truy cập.

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

/ ****** Đối tượng: StoredProcedure [dbo]. [Get ALLEmp nhân viên] Tập lệnh Ngày: 27/11/2016 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

2

Bạn có thể cho phép mọi người thực thi quyền:

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

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


1

Tôi đã phải đối mặt với cùng một vấn đề và tôi cũng đã giải quyết vấn đề cấp quyền cho db_owner cho người dùng Cơ sở dữ liệu.


11
Tôi không nghĩ rằng đây là một giải pháp tốt ... vì tôi không thể cấp cho ứng dụng web của mình quyền này .. tôi không biết ai sẽ bỏ phiếu này
Mina Gabriel

7
Không nên, vì điều này rất không an toàn. Bạn nên tạo các vai trò phù 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

Nếu bạn làm cho người dùng này đặc biệt cho một cơ sở dữ liệu cụ thể, thì có thể bạn không đặt nó làm db_owner trong "ánh xạ người dùng" của các thuộc tính


1

bạn nên sửa đổi vai trò máy chủ, được thiết kế cho các đặc quyền bảo mật. thêm vai trò máy chủ sysadmin cho người dùng của bạn. để bảo mật tốt hơn, bạn có thể có vai trò máy chủ tùy chỉnh của mình. nhưng phương pháp này sẽ cung cấp cho bạn những gì bạn muốn bây giờ.

  1. Object Explorer -> Máy chủ -> Bảo mật -> Đăng nhập
  2. Nhấp chuột phải vào người dùng mong muốn của bạn
  3. Chuyển đến Vai trò Máy chủ ở phía bên tay trái
  4. Hãy chắc chắn rằng sysadmin đã được kiểm tra
  5. Nhấn OK và khởi động lại máy chủ SQL của bạn

Chúc may mắn

nhập mô tả hình ảnh ở đây


1
sysadmin là quá mức cần thiết (và nguy hiểm)
Trub

0

Đây là cách cấp quyền cho một người dùng không công khai,

Truy vấn trực tiếp:

Use MyDatabase Grant execute on [dbo].[My-procedures-name] to [IIS APPPOOL\my-iis-pool] Go

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.