SQL 2005数据库角色和安全性

时间:2010-08-07 23:24:24

标签: sql database sql-server-2005 roles

我已经开始在Sql Server 2005中创建/使用模式,我还在其中创建了数据库角色并为角色分配了模式。

我遇到的问题是我应该具有完全访问权限的db角色之一 - 比如说SuperSysRole 但是,当我为该角色分配登录时,它无法执行特定命令。特别是,我希望这个角色的用户能够管理密码重置。但是,当我执行存储过程时,它不会返回数据库中的所有用户。

已运行存储过程,该过程返回详细信息并调用集成sysuserssysmembers表的视图。

用户,比如myAdmin,已被分配到角色SuperSysRole。 SuperSysRole的角色已被授予执行存储过程selectRoles。

这可能是一件简单的事情,但有人可以告诉我我错过了什么吗? 我的应用程序使用myAdmin用户名和密码进行身份验证。当我使用sa帐户登录时,它工作正常。

1 个答案:

答案 0 :(得分:3)

数据库角色成员资格可通过sys.database_principalssys.database_role_members目录视图查询,这些视图是要使用的正确目录视图,而不是已弃用的sysusers和sysmembers。两者都有相同的安全限制:

  

在SQL Server 2005及更高版本中,   元数据的可见性   目录视图仅限于securables   用户拥有或拥有的   用户已被授予一些   权限。

必要的权限列在GRANT Database Principal PermissionsVIEW DEFINITION中。没有权限可以授予查看任何主体和角色定义。

您最好的选择是创建一个过程,从适当的元数据目录视图中进行选择,并使用添加到db_securityadmin角色的凭据对此过程进行签名。有关如何签署过程的示例,请参阅Signing an Activated Procedure。对于需要查看这些主体和角色成员资格的人,请执行此过程的EXECUTE。

但是,所有这些都将使您无法理解声明的意图:管理密码重置。只有服务器主体(也称为.logins)具有密码,并且在数据库主体级别设计的任何方案都不会对服务器主体产生影响,因为它们是错误的抽象。由于没有要定义的服务器角色(您只能将Windows组作为角色,但是您希望使用SQL Auth),因此您无法通过角色成员身份完成此任务。

我的建议是再次使用代码签名。创建执行所需活动的过程(查询sys.server_principalssys.sql_logins以检查密码过期,发出ALTER LOGIN语句以重置密码等)然后使用代码签名来签署这些过程并将所需权限授予签名。我再次向您推荐Signing an activated procedure,了解如何做到这一点。然后将这些过程的EXECUTE授予必须管理这些过程的“特殊”用户。