授予用户对数据库中所有存储过程的执行权限?


104

我从旧数据库生成脚本,创建了新数据库,并从旧数据库导入了所有数据。但是到目前为止,还没有用户对存储过程具有执行权限。我知道我可以用

GRANT EXECUTE ON [storedProcName] TO [userName] 

但是,如果仅仅是几个过程,那么我大约有100个,那么对我来说,授予特定用户执行访问权限的最简单方法是什么?

提前致谢。

Answers:


115

创建一个角色将此角色添加到用户,然后您可以一次将所有例程的执行授予该角色。

CREATE ROLE <abc>
GRANT EXECUTE TO <abc>

编辑
这在SQL Server 2005中有效,我不确定此功能的向后兼容性,我确定2005年以后的版本都可以。


我刚刚在SQL Server 2008 Standard(amazon RDS)上尝试了此方法,它的工作原理很吸引人。
datagod

你能举个例子吗?可以说我需要为用户SPExecuter授予所有SP的EXECUTE权限
Uri Abramson

4
唯一需要的其他语句是将用户添加到角色的行,如下所示:ALTER ROLE [abc] ADD MEMBER [user_name]
dhochee 2013年

公开授予公众
Simon Hughes

27
实际上,您不需要创建角色,可以将其直接应用于用户,例如GRANT EXECUTE T​​O userName。我认为这足以解决OP的问题。
克里斯·孔雀

25

在不使问题复杂化的情况下,对所选数据库授予EXECUTE:

USE [DB]
GRANT EXEC TO [User_Name];

1
为我工作,大概涵盖了将来所有存储的proc(我们会发现),而不是为每个存储的proc命名的脚本。
肯·弗斯伦德

19

这是一个解决方案,这意味着当您向架构中添加新的存储过程时,用户可以执行它们而不必在新的存储过程上调用Grant execute:

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

参考:授予对所有存储过程的执行权限


6

使用以下代码,更改适当的数据库名称和用户名,然后获取该输出并在SSMS中执行。对于SQL 2005以上

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

1
您还需要包括“ PC”类型以包括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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.