如何在登录时隐藏您没有访问权限的数据库SQL Server 2005 / 2008
?
目前,如果用户连接,他们会看到服务器上的所有数据库,这意味着他们必须扫描列表才能找到他们的数据库.
经过几个小时试图找出如何创建只能访问1个DB的用户帐户,并且只能看到该数据库.我想我想通了!!!!
创建一个用户帐户(确保它没有映射到任何数据库,否则你将得到最终错误消息15110,级别16,状态1并注意建议的解决方案)
USE [master] GO CREATE LOGIN [us4] WITH PASSWORD=N'123', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
右键单击SQL(SQLSERVER名称)的上部> Properties
> Permissions
>点击user account
,并选择Deny
查看数据库.
use [master] GO DENY VIEW ANY DATABASE TO [us4]
右键单击新创建的数据库,属性,文件,然后将所有者更改为新创建的帐户.(重要说明: ALTER ROLE [db_owner] ADD MEMBER [us4]
不起作用)
USE [dbname] GO EXEC dbo.sp_changedbowner @loginame = N'us4', @map = false
此时,一旦用户登录,他将看到Master,tempdb并且还将看到他是数据库所有者的新数据库.您可能想要去Tools>Option
并启用隐藏系统对象的选项以便您不要不显示master,tempdb等.如果此选项不起作用,您可能还需要SP1
Msg 15110, Level 16, State 1, Line 1 The proposed new database owner is already a user or aliased in the database.
建议的Msg 15110解决方案:解决上述错误只需从数据库安全节点中删除用户,然后重试
希望有帮助......
尼基尔
这实际上不会以有意义的方式工作,或者你可能期望它会工作.
您REVOKE VIEW ANY DATABASE
来自public角色,但随后用户必须是数据库的数据库所有者或者它无法看到,但它仍然可以被访问.
问题是数据库引擎安全性的缺点,并且不太可能在SQL Server的当前版本或未来版本中修复.
Erland Sommarskog刚刚开设了以下连接项目,最近在Twitter和微软上讨论了它SQL MVP's
.
投票支持连接并帮助微软更好地修复:
连接反馈
基本上,权限存储在数据库级别,因此需要枚举每个数据库以确定用户是否具有在对象资源管理器中显示数据库的连接权限,这是一项昂贵的任务以及旧的EM如何用于执行操作.
建议的解决方案是在服务器级别维护此信息,这是一个重大变化.
您需要从角色PUBLIC撤消权限'查看任何数据库'(SQL SERVER 2005以后)