2009-06-01 131 views
34

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

回答

13

您需要撤销

+5

注:这可能不适合你,如果你不能使该用户登录数据库的DBO你希望他管理,或者如果您想以这种方式保护多个登录名,因为只有一个登录名可以是数据库的实际DBO。 – 2009-06-01 14:35:54

0

似乎有在MS SQL 2005和2008服务器端设置来限制的数据库进行权限“查看任何数据库”从角色PUBLIC(SQL SERVER 2005年起)用户可能会看到。我在sql-server-performance.com

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

19

这实际上不会工作的方式是有道理的,或者你可能会认为它会。您从公共角色REVOKE查看任何数据库,但用户必须是数据库的数据库所有者,否则无法看到,但仍可以访问。这个问题是数据库引擎安全性的一个缺点,不太可能在当前或将来的SQL Server版本中得到修复。 Erland Sommarskog前段时间为此打开了以下连接项目,并且最近在Twitter上和Microsoft MVP上讨论了它。投票的连接,并帮助它更优先的为微软修复:

Connect Feedback

基本上权限存储在数据库级别,所以它需要列举每个数据库,以确定用户是否连接在对象浏览器中显示数据库的权限,这是一项昂贵的任务,以及旧式EM用于执行操作的方式。建议的解决方案是将这些信息保存在服务器级别,这是一个重大变化。

+2

+1,这似乎是迄今为止最完整彻底的答案。 – stakx 2013-06-21 22:04:12

+0

请在Connect链接中投票,虽然它在8年以上仍然被标记为ACTIVE – BiLaL 2015-12-14 17:29:23

48

经过数小时试图找出如何创建只能访问1个数据库的用户帐户,并且只能看到该数据库。我想我想通了!

  1. 创建用户帐户(确保其不映射到任何数据库,否则你将得到最后的错误消息15110,级别16,状态1,并注意建议的解决方案

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

    使用[大师] GO DENY ANY VIEW DATABASE TO [US 4]

  3. 右键单击新创建的数据库,属性文件,并更改业主向新创建的帐户。(重要提示:ALTER ROLE [的db_owner]添加成员[US 4] 不起作用

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

在这一点上,一旦用户登录,他会看到法师,tempdb中和会也可以看到他是数据库所有者的新数据库。您可能想要转至工具>选项并启用隐藏系统对象的选项,以便不显示主数据库,临时数据库等。您可能还需要SP1如果此选项不起作用

Msg 15110, Level 16, State 1, Line 1 
The proposed new database owner is already a user or aliased in the database. 

提出的解决方案消息15110:解决上述错误简单地删除数据库中的安全节点的用户,然后再试一次

希望帮助.. 。

尼基尔

+5

这很好,但如果我不希望该用户成为db的所有者,但仍然能够看到它在SSMS? – friism 2011-01-30 01:12:45

1
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 
相关问题