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

Nic*_*ick 96 sql sql-server sql-server-2000

我从旧数据库生成脚本,创建了一个新数据库并从旧数据库导入了所有数据.然而,到目前为止,没有用户拥有存储过程的执行权限.我知道我可以使用

GRANT EXECUTE ON [storedProcName] TO [userName] 
Run Code Online (Sandbox Code Playgroud)

但是,如果它只是一些程序,那么我有大约100个,那么对于特定用户授予所有这些权限的最简单方法是什么?

提前致谢.

San*_*ath 111

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

CREATE ROLE <abc>
GRANT EXECUTE TO <abc>
Run Code Online (Sandbox Code Playgroud)

编辑
这在SQL Server 2005中有效,我不确定这个功能的向后兼容性,我确信任何晚于2005年应该没问题.

  • 您实际上不需要创建角色,您可以直接将其应用于用户,例如GRANT EXECUTE T​​O userName.我认为这足以解决OP的问题. (26认同)
  • 唯一需要的其他语句是将用户添加到角色的行,如下所示:ALTER ROLE [abc] ADD MEMBER [user_name] (4认同)

Col*_*lin 17

这是一个解决方案,这意味着当您向架构添加新的存储过程时,用户可以执行它们,而无需在新的存储过程上调用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
Run Code Online (Sandbox Code Playgroud)

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


Bar*_*z X 12

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

USE [DB]
GRANT EXEC TO [User_Name];
Run Code Online (Sandbox Code Playgroud)


小智 6

使用下面的代码,更改正确的数据库名称和用户名,然后获取该输出并在SSMS中执行.FOR SQL 2005以上

USE <database_name> 
select 'GRANT EXECUTE ON ['+name+'] TO [userName]  '  
from sys.objects  
where type ='P' 
and is_ms_shipped = 0  
Run Code Online (Sandbox Code Playgroud)