如何在登录SQL Server 2005 / 2008
时隐藏您没有访问权限的数据库?
目前,如果用户连接,他们会看到服务器上的所有数据库,这意味着他们必须通过列表进行扫描才能找到他们的数据库。
答案 0 :(得分:49)
尝试弄清楚如何创建只能访问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解决方案:解决上述错误只需从数据库安全节点中删除用户并再试一次
希望有帮助...
尼基尔
答案 1 :(得分:21)
这实际上不会以有意义的方式工作,或者你可能期望它会工作。
您是公共角色的REVOKE VIEW ANY DATABASE
,但用户必须是数据库的数据库所有者,或者无法看到它,但仍然可以访问它。
问题是数据库引擎安全性的缺点,并且不太可能在SQL Server的当前版本或未来版本中修复。
Erland Sommarskog 在此之前为此打开了以下连接项目,最近在Twitter上与SQL MVP's
与微软进行了讨论。
投票支持连接并帮助微软更好地解决这个问题:
基本上,权限存储在数据库级别,因此需要枚举每个数据库以确定用户是否具有在对象资源管理器中显示数据库的连接权限,这是一项昂贵的任务以及如何使用旧的EM做事。
建议的解决方案是在服务器级别维护此信息,这是一个重大变化。
答案 2 :(得分:14)
您需要从角色PUBLIC撤消权限'VIEW ANY DATABASE'(SQL SERVER 2005以后)
答案 3 :(得分:1)
删除查看任何数据库权利后,将用户添加到数据库作为Db所有者
这将仅显示SSMS中登录所拥有的数据库。
USE master; GO
DENY VIEW ANY DATABASE TO [loginname]; GO
USE [your db]; GO
DROP USER [loginname]; GO
USE master; GO
ALTER AUTHORIZATION ON DATABASE::[your db]TO [loginname]; GO
注意:这需要登录已存在
答案 4 :(得分:0)
MS SQL 2005和2008上似乎存在服务器端设置,以限制用户可能看到的数据库。我在sql-server-performance.com
找到了以下文字在SQL Server 2005中,可以使用已创建的新服务器端角色。查看任何DATABASE权限是一个新的服务器级权限。使用此权限授予的登录名可以查看描述所有数据库的元数据,无论登录是否拥有或实际上是否可以使用特定数据库。请注意默认情况下,VIEW ANY DATABASE权限被授予public角色。因此,默认情况下,连接到SQL Server 2005实例的每个用户都可以看到实例中的所有数据库。