我创建了一个在后台使用 SQL Server 2008 R2 数据库的 Web 应用程序。应用程序使用集成安全 SSPI 连接到数据库,因此用户需要获得数据库服务器的访问权限。
所有应该使用该应用程序的用户都是特定 AD 域组的成员。
这就是我所做的
我在 SQL Server 级别添加了一个新的安全登录,并提供了显示为组的 AD 域组名(基于图标)
然后我打开了此服务器登录属性对话框并打开用户映射我检查了我希望此 AD 域组的用户访问的特定数据库的设置(见下图)
下面的列表中显示数据库角色成员身份在哪里民众已检查。
我以单独的 SQL Server 用户身份创建了数据库中的所有对象安全管理员许可和提供的架构德博对于每个对象,如下所示:
create table dbo.SomeTable ... create procedure dbo.SomeProcedure ...
所有数据库操作均通过仅限存储过程. 没有表被应用程序直接访问。
基于这些事实(包含我的对象的 dbo 模式、AD 域组安全登录、仅存储过程执行),我想知道应该在 AD 域组服务器登录上设置哪个角色成员资格才能使用我的数据库。
用户应该有权限执行存储过程。另一方面,存储过程可以做其他所有事情。对表执行 CRUD 操作,执行用户定义的函数并相互调用。
问题
环境db_datareader和db_datawriter(如下所示)是否还不够,正如我的用户看到的错误屏幕所暗示的那样(存储过程据称不存在)?
如何在 AD 域组上设置安全权限,以便它能够查看dbo
对象并执行这些存储过程?
答案1
解决方案
仅应用 db_datareader 和 db_datawriter 是不够的,因为它们都没有被授予存储过程执行权限。您应该为数据库中的每个存储过程授予执行权限,或者... 相当繁琐。
如果您的数据库是 SQL Server 2005 或更高版本(我的是 SQL Server 2008 R2,因此可以覆盖),您可以轻松完成此操作:
创建名为数据库执行程序
create role db_executor
授予数据库中所有存储过程的存储过程执行权限
grant execute to db_executor
如果您只想向特定于架构的存储过程授予执行权限,则应按以下方式执行最后一个调用(调整架构名称 -德博- 按要求):
grant execute on schema::dbo to db_executor
就是这样。然后您要做的就是将您的用户(或在我的情况下是一个组)设置为此角色的成员,然后一切就会按预期进行。