我有一个 SQL Server 实例,上面有大约 50 个数据库。一位开发人员,叫他 Joe,想要访问一个现有数据库。因此,我继续在 SQL Server 2005 Management Studio 中创建一个新的登录帐户,并在用户映射部分中指定他有权访问这个数据库。
登录后,我们注意到他可以访问任何数据库并打开所有表、删除表等。
我该如何限制他而不让他成为数据库的 db_owner?这与角色下的“公共”访问权限有关吗?
这是我采取的步骤:进入管理工作室,转到“安全”->“登录”,右键单击并添加新的“登录”。选择“Windows 身份验证”。在用户映射选项卡中,我选择了他应该有权访问的数据库,认为这将使他只能访问此数据库。
然后我启动了管理工作室并以他的身份登录(Windows 身份验证),他可以打开并查看所有数据库中的所有表吗?但我不想让他访问所有这些?
答案1
听起来 Joe 是域组的成员,该域组在 SQL Server 上拥有的权限超出了您的需要,或者您一直在干扰服务器上其他数据库中公共角色的权限。无论是哪种情况,您都需要找出额外权限的来源,以便修复它们。
您可以使用存储过程 xp_logininfo 来查看 Joe 能够通过哪些域组访问数据库。
exec xp_logininfo 'YourDomain\JoesUserName'
如果这不能为您指明正确的方向,您将需要查看其他数据库中授予公共角色的权限。
答案2
他们拥有的权利比你所期望的还要多。
这不是 Windows 身份验证,而是权限。
在所有数据库中查看意味着他们在服务器级别拥有“系统管理员”权限或可以通过 Windows 组访问。通常,某人可以看到所有数据库,但在尝试扩展它时会出错。没有错误 = 分配了一些权限。
如果“DROP”适用于所有数据库,则表示 sysadmin。
“Joe” 是 SQL 管理员组的成员吗?