Cấp quyền thực thi cho người dùng trên tất cả các thủ tục được lưu trữ trong cơ sở dữ liệu?


104

Tôi đã tạo tập lệnh từ cơ sở dữ liệu cũ, tạo cơ sở dữ liệu mới và nhập tất cả dữ liệu từ cơ sở dữ liệu cũ. Tuy nhiên, cho đến nay rất tốt, không có người dùng nào có quyền thực thi các thủ tục được lưu trữ. Tôi biết tôi có thể sử dụng

GRANT EXECUTE ON [storedProcName] TO [userName] 

Tuy nhiên, nếu đó chỉ là một vài thủ tục, tôi có khoảng 100, vậy cách dễ nhất để tôi cấp quyền truy cập thực thi cho một người dùng cụ thể cho tất cả họ là gì?

Cảm ơn trước.

Câu trả lời:


114

Tạo vai trò thêm vai trò này cho người dùng và sau đó bạn có thể cấp quyền thực thi tất cả các quy trình trong một lần cho vai trò này.

CREATE ROLE <abc>
GRANT EXECUTE TO <abc>

CHỈNH SỬA
Tính năng này hoạt động trong SQL Server 2005, tôi không chắc về khả năng tương thích ngược của tính năng này, tôi chắc chắn rằng mọi thứ sau năm 2005 sẽ ổn.


Tôi vừa thử điều này trên SQL Server 2008 Standard (amazon RDS) và nó hoạt động như một sự quyến rũ.
datagod

bạn có thể vui lòng cung cấp một ví dụ? cho phép nói rằng tôi cần phải cấp EXECUTE quyền truy cập vào tất cả các SP của cho SPExecuter dùng
Uri Abramson

4
câu lệnh khác duy nhất cần thiết là dòng thêm người dùng vào vai trò, như vậy: ALTER ROLE [abc] THÊM THÀNH VIÊN [user_name]
dhochee

CẤP EXEC ĐẾN công cộng
Simon Hughes

27
Bạn thực sự không cần phải tạo một vai trò, bạn có thể áp dụng vai trò này trực tiếp cho người dùng, ví dụ: CẤP THỰC HIỆN CHO tên người dùng. Tôi nghĩ điều này là đủ cho câu hỏi của OP.
Chris Peacock,

25

Không làm phức tạp vấn đề, để cấp quyền THỰC HIỆN trên cơ sở dữ liệu đã chọn:

USE [DB]
GRANT EXEC TO [User_Name];

1
đã làm việc cho tôi và có lẽ bao gồm tất cả các proc được lưu trữ trong tương lai (chúng ta sẽ tìm hiểu), thay vì các tập lệnh đặt tên cho từng proc được lưu trữ.
Ken Forslund

19

Đây là một giải pháp có nghĩa là khi bạn thêm các thủ tục mới được lưu trữ vào lược đồ, người dùng có thể thực thi chúng mà không cần phải gọi cấp thực thi trên thủ tục được lưu trữ mới:

IF  EXISTS (SELECT * FROM sys.database_principals WHERE name = N'asp_net')
DROP USER asp_net
GO

IF  EXISTS (SELECT * FROM sys.database_principals 
WHERE name = N'db_execproc' AND type = 'R')
DROP ROLE [db_execproc]
GO

--Create a database role....
CREATE ROLE [db_execproc] AUTHORIZATION [dbo]
GO

--...with EXECUTE permission at the schema level...
GRANT EXECUTE ON SCHEMA::dbo TO db_execproc;
GO

--http://www.patrickkeisler.com/2012/10/grant-execute-permission-on-all-stored.html
--Any stored procedures that are created in the dbo schema can be 
--executed by users who are members of the db_execproc database role

--...add a user e.g. for the NETWORK SERVICE login that asp.net uses
CREATE USER asp_net 
FOR LOGIN [NT AUTHORITY\NETWORK SERVICE] 
WITH DEFAULT_SCHEMA=[dbo]
GO

--...and add them to the roles you need
EXEC sp_addrolemember N'db_execproc', 'asp_net';
EXEC sp_addrolemember N'db_datareader', 'asp_net';
EXEC sp_addrolemember N'db_datawriter', 'asp_net';
GO

Tham khảo: Cấp quyền thực thi đối với tất cả các thủ tục được lưu trữ


6

sử dụng mã bên dưới, thay đổi tên cơ sở dữ liệu và tên người dùng thích hợp, sau đó lấy đầu ra đó và thực thi trong SSMS. ĐỐI VỚI SQL 2005 TRÊN

USE <database_name> 
select 'GRANT EXECUTE ON ['+name+'] TO [userName]  '  
from sys.objects  
where type ='P' 
and is_ms_shipped = 0  

1
Bạn cũng cần bao gồm loại 'PC' để bao gồm các thủ tục được lưu trữ CLR.
Oleh Nechytailo

1
USE [DATABASE]

DECLARE @USERNAME VARCHAR(500)

DECLARE @STRSQL NVARCHAR(MAX)

SET @USERNAME='[USERNAME] '
SET @STRSQL=''

select @STRSQL+=CHAR(13)+'GRANT EXECUTE ON ['+ s.name+'].['+obj.name+'] TO'+@USERNAME+';'
from
    sys.all_objects as obj
inner join
    sys.schemas s ON obj.schema_id = s.schema_id
where obj.type in ('P','V','FK')
AND s.NAME NOT IN ('SYS','INFORMATION_SCHEMA')


EXEC SP_EXECUTESQL @STRSQL
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.