从Management Studio隐藏SQL数据库

如何隐藏login到SQL Server 2005/2008时无权访问的数据库? 目前,如果用户连接,他们会看到服务器上的所有数据库,这意味着他们必须扫描列表来查找他们的数据库。

您需要从angular色PUBLIC(SQL SERVER 2005起)中撤销权限“VIEW ANY DATABASE”

经过数小时试图找出如何创build一个用户帐户只能访问1个数据库,只能看到该数据库。 我想我知道了!

  1. 创build一个用户帐户( 确保它没有映射到任何数据库,否则你将得到最终的错误消息15110,级别16,状态1,并注意提出的解决scheme

    USE [master] GO CREATE LOGIN [us4] WITH PASSWORD=N'123', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF 
  2. 右键单击SQL(SQLSERVER名称)>属性>权限的上半部分,单击用户帐户,然后select拒绝以查看数据库。

    使用[master] GO DENY查看任何数据库到[us4]

  3. 右键单击新创build的数据库,属性,文件,然后将所有者更改为新创build的帐户( 重要说明 :ALTER ROLE [db_owner]添加成员[us4] 不起作用

     USE [dbname] GO EXEC dbo.sp_changedbowner @loginame = N'us4', @map = false 

在这一点上,一旦用户login,他会看到Master,tempdb,并且还会看到他是数据库所有者的新DB。您可能想要转到工具>选项,并启用隐藏系统对象的选项你不显示主,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 15110build议的解决scheme:解决上述错误只需从数据库安全节点删除用户,然后再试一次

希望有帮助…

尼基尔

这实际上不会有意义的方式,或者你可能会期望的。 您从公共angular色撤销任何数据库,但用户必须是数据库的数据库所有者,否则无法看到,但仍然可以访问。 这个问题是数据库引擎安全性的一个缺点,不太可能在当前或将来的SQL Server版本中得到修复。 Erland Sommarskog不久前为此打开了以下连接项目,最近在微软和Microsoft MVP上进行了讨论。 为连接投票,并帮助微软更加重视修复:

连接反馈

基本上权限是存储在数据库级别的,所以需要枚举每个数据库来确定用户是否有连接权限来在对象资源pipe理器中显示数据库,这是一个昂贵的任务,以及旧的EM如何用来做事情。 提出的解决scheme是将这些信息保存在服务器级别,这是一个重大的变化。

 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 

在MS SQL 2005和2008上似乎有一个服务器端设置来限制用户可能看到的数据库。 我在sql-server-performance.com上find了以下文本

在SQL Server 2005中,可能会创build一个新的服务器端angular色。 查看任何数据库权限是一个新的服务器级权限。 使用此权限授予的login名可以查看描述所有数据库的元数据,而不pipelogin名是拥有还是可以实际使用特定的数据库。 请注意默认情况下,VIEW ANY DATABASE权限授予公共angular色。 因此,默认情况下,连接到SQL Server 2005实例的每个用户都可以看到实例中的所有数据库。