Câu hỏi 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?


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 vẫn không có người dùng nào thực hiện quyền đối với 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] 

Nếu đó chỉ là một vài thủ tục, tuy nhiên, tôi có khoảng 100 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ả chúng là gì?

Cảm ơn trước.


76
2018-03-25 04:01


gốc




Các câu trả lời:


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 cho tất cả các thường trình trong một lần chụp cho vai trò này.

CREATE ROLE <abc>
GRANT EXECUTE TO <abc>

CHỈNH SỬA
Điều này làm việc trong SQL Server 2005, tôi không chắc chắn về tính tương thích ngược của tính năng này, tôi chắc chắn rằng bất cứ điều gì sau năm 2005 nên được sử dụng tốt.


91
2018-03-25 04:06



Tôi chỉ cố gắng này trên SQL Server 2008 Standard (amazon RDS) và nó làm việc như một say mê. - 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 quyền EXECUTE trên tất cả SP cho người dùng SPExecuter - Uri Abramson
câu lệnh duy nhất cần thiết là dòng thêm người dùng vào vai trò, như sau: ALTER ROLE [abc] THÊM THÀNH VIÊN [user_name] - dhochee
GRANT EXEC TO công khai - Simon Hughes
Bạn không thực sự cần tạo vai trò, bạn có thể áp dụng trực tiếp vai trò này cho người dùng, ví dụ: GRANT EXECUTE TO userName. Tôi nghĩ điều này là đủ cho câu hỏi của OP. - Chris Peacock


Đây là một giải pháp có nghĩa là khi bạn thêm các thủ tục được lưu trữ mới vào lược đồ, người dùng có thể thực hiện chúng mà không cần phải gọi cấp quyền thực hiện 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

Tài liệu tham khảo: Cấp quyền thi hành trên tất cả các thủ tục được lưu trữ


15
2017-10-01 14:45





sử dụng mã dưới đây, thay đổi tên cơ sở dữ liệu thích hợp và tên người dùng và sau đó lấy đầu ra đó và thực hiện trong SSMS. CHO 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  

5
2018-03-20 16:36



Bạn cũng cần bao gồm cả loại 'PC' để bao gồm các thủ tục lưu sẵn CLR. - Oleh Nechytailo


Nếu không có quá phức tạp vấn đề, để cấp EXECUTE trên cơ sở dữ liệu đã chọn:

USE [DB]
GRANT EXEC TO [User_Name];

2
2018-01-02 13:33





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

1
2017-08-21 10:55