SQL 服务器:仅允许在某些存储过程上执行的权限

SQL Server : permissions to only allow execute on some stored procedures

首先,我从来没有负责过数据库安全,这对我来说真的很陌生,所以请原谅这个问题是否不好 - 我会尽量提供尽可能多的信息。我四处搜索,但没有详细了解我的具体问题。

我正在使用 SQL Server 2008 R2 数据库,我需要能够限制所有域用户在明确定义时只能执行某些存储过程。就像在所有数据库 tables/views/stored 过程上拒绝 select/update/delete/etc,除了明确定义的一些存储过程(将存储过程授予用户(下面的域用户)执行)。

我认为使用服务器角色这会很容易,但似乎自定义服务器角色仅在 SQL Server 2012 及更高版本中可用,并且 public 服务器角色授予 select 访问权限在我所有的桌子上。我读到拒绝总是优先于授予,所以我设置了一个数据库角色,将 select 访问权限设置为拒绝,但用户仍然可以查询表。

这是我在包含 2 个数据库的 1 台服务器上的当前设置:

服务器等级:

数据库级别:

问题是用户仍然可以从我的表中select,就好像权限不存在一样。知道我在这里做错了什么吗?

问题原来是 'db_datareader' 角色除了我的自定义数据库角色 (SP_Reader) 之外还分配给了数据库用户,该角色仅提供对某些存储过程的执行。

'db_datareader' 角色未被注意到,因为我正在查询 'sys.database_permissions',它不显示隐式授予的权限。

我最终找到了这个 Microsoft link,它提供了一个查询 returns 所有数据库角色的成员:

SELECT DP1.name AS DatabaseRoleName,   
   isnull (DP2.name, 'No members') AS DatabaseUserName   
 FROM sys.database_role_members AS DRM  
 RIGHT OUTER JOIN sys.database_principals AS DP1  
   ON DRM.role_principal_id = DP1.principal_id  
 LEFT OUTER JOIN sys.database_principals AS DP2  
   ON DRM.member_principal_id = DP2.principal_id  
WHERE DP1.type = 'R'
ORDER BY DP1.name;

或者,此内部存储过程 returns 为您作为参数传递的任何角色生成结果:

EXEC sp_helprolemember 'db_datareader';