none
如何在不改变数据库所有者的前提下让用户只能访问指定的数据库 RRS feed

  • 问题

  • 各位好:

    我希望某个登录名(同时也映射到数据库的同名用户上)能够在不改变数据库所有者的前提下访问指定的数据库,请问如何做?

    如下是我知道的两个方法,但都需要改变数据库的所有者,而且执行完后,他们都会把登录名映射到数据库的dbo用户上,而不是我想要的同名用户:

    method one: USE master; GO ALTER AUTHORIZATION ON DATABASE::testDb TO readonly; GO

    method two :Use [db]; go; EXEC dbo.sp_changedbowner N'readonly'


    chenl

    2016年7月20日 8:53

答案

  • 已经设置了,但在SSMS还是只能看到master和tempdb。

    chenl

    说过了,看不到,但不影响使用

    ssms 好像一直是这样设计的,不知道算BUG还是故意如此,查 sys.databases 可以看到有权限的库,profile 跟踪 ssms 刷新库列表,也可以看到它执行的那个 sql 会列出有权限的库,但就是不显示给你看

    • 已标记为答案 i6first 2016年7月22日 8:35
    2016年7月21日 7:20

全部回复

  • 在要访问的数据库上授权就行了啊

    use testDb ;

    create user xx; -- xx 为你要授权的用户

    exec sp_addrolemember db_owner, xx; -- db_owner 为所有权,可以根据需要调整,具体参考官方文档 sp_addrolemember 中的说明

    2016年7月20日 10:07
  • owner可不是应该随便授权给用户的。owner通常是sa或者其它的系统管理员。

    想不想时已是想,不如不想都不想。

    2016年7月20日 10:22
    版主
  • 谢谢邹大侠的答复。

    我这个用户已经是dbowner了,但还是看不到任何数据库

    当然,我执行了deny view any database to readonly,

    可是如果我不执行这个语句,他就可以看到所有的数据库。


    chenl

    2016年7月20日 10:23
  • DB owner is database level permission, you have to grand permission to user in every db needs to access to.
    2016年7月20日 16:20
  • VIEW ANY DATABASE 权限是新的、服务器级别权限。获得此权限的登录帐户可以查看描述所有数据库的元数据,不管该登录帐户是否拥有特定的数据库或实际上是否可以使用该数据库。

    VIEW ANY DATABASE 权限控制是否显示 <mshelp:link filterstring="(("ProductVers"="kbsqlserv105") OR ("DocSet"="NETFramework"))" keywords="46c288c1-3410-4d68-a027-3bbf33239289" tabindex="0">sys.databases</mshelp:link> 和 <mshelp:link filterstring="(("ProductVers"="kbsqlserv105") OR ("DocSet"="NETFramework"))" keywords="60a93880-62f1-4eda-a886-f046706ba90c" tabindex="0">sys.sysdatabases</mshelp:link> 视图以及 <mshelp:link filterstring="(("ProductVers"="kbsqlserv105") OR ("DocSet"="NETFramework"))" keywords="4c3e3302-6cf1-4b2b-8682-004049b578c3" tabindex="0">sp_helpdb</mshelp:link> 系统存储过程中的元数据。

    默认情况下,将 VIEW ANY DATABASE 权限授予 public 角色。因此,默认情况下,每个连接到 SQL Server 实例的用户都可查看该实例中的所有数据库。

    若要限制数据库元数据的可见性,请拒绝登录帐户的 VIEW ANY DATABASE 权限。拒绝此权限之后,登录帐户只能查看 mastertempdb以及所拥有的数据库的元数据

    ------------------------- 参考联机帮助上关于这个权限的说明

    2016年7月21日 0:53
  • ssms 中不会列出,但不影响使用
    2016年7月21日 1:02
  • db-datareader, db-datawriter 权限要给

    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年7月21日 2:34
  • 邹建说得对。deny view any database之后,就看不到了。但是还是可以访问的。

    另外,再次强调,不应该随便授权db_owner。

    readonly账号,授权db_datareader(以及需要执行的存储过程、函数等)就可以了。不应该图方便,授权db_owner。


    想不想时已是想,不如不想都不想。

    2016年7月21日 3:16
    版主
  • 若要限制数据库元数据的可见性,请拒绝登录帐户的 VIEW ANY DATABASE 权限。拒绝此权限之后,登录帐户只能查看 mastertempdb以及所拥有的数据库的元数据.

    我已经拒绝登录账户的view any database的权限,关键是,这个账户在SSMS只能看到master和temppdb,看不到所拥有的数据库,我如何让他看到呢?


    chenl

    2016年7月21日 6:02
  • 已经设置了,但在SSMS还是只能看到master和tempdb。

    chenl

    2016年7月21日 6:40
  • 已经设置了,但在SSMS还是只能看到master和tempdb。

    chenl

    说过了,看不到,但不影响使用

    ssms 好像一直是这样设计的,不知道算BUG还是故意如此,查 sys.databases 可以看到有权限的库,profile 跟踪 ssms 刷新库列表,也可以看到它执行的那个 sql 会列出有权限的库,但就是不显示给你看

    • 已标记为答案 i6first 2016年7月22日 8:35
    2016年7月21日 7:20
  • 选数据库那个下拉的地方好像是可以看到的。

    想不想时已是想,不如不想都不想。

    2016年7月21日 9:56
    版主
  • 其实影响使用,每次给人开了权限,别人都要问我,看不到数据库啊,是不是没给权限啊。。。。。。

    chenl

    2016年7月22日 4:42
  • 其实影响使用,每次给人开了权限,别人都要问我,看不到数据库啊,是不是没给权限啊。。。。。。

    chenl

    这个里面确实没有,你可以找微软投诉去
    2016年7月22日 5:49