如果你创建了一个登录账号,希望这个登陆账号通过Microsoft SQL Server Management Studio客户端工具登录到SQL Server时,只有查看左边目录树的权限,那么应该如何设置呢?

 

下面的代码,就可以实现这个功能:

 

1、建立数据库、登录账号、数据库用户,授予权限

--先建立2个数据库,用来做实验 create database wcc go  create database ggg go

 

--以下代码都是在sa账户下执行的   --1.建立登录名 ggg use master go  if exists(select * from sys.server_principals            where name ='ggg')    drop login ggg go  create login ggg    with password = 'ggg',        default_database = [master],        check_expiration = off,        check_policy = off go   /* 2.注意这里的ggg是登录名,授予服务器级别的查看定义权限   这样,你用ggg登录后,可以看到左边的目录树,   但是当你点击任意用户数据库,比如下面的 wcc数据库,   就会报错! */ grant view any definition to ggg    /* 3.上面的登录名,那么如果你要查看某个数据库下面的目录树,   那么必须要创建挂到这个登录名上的,数据库用户名,   这里是数据库用户 ggg   */ use wcc go  if exists(select * from sys.database_principals           where name = 'ggg')    drop user ggg go         create user ggg for login ggg go  --这里创建一个表,用来测试权限 if OBJECT_ID('test') is not null    drop table test go  create table test ( 	id int, 	v varchar(10) )  insert into test(id,v) select 1,'aa' union all select 2,'bb' union all select 3,'cc'   /* 4.这里的ggg是数据库用户,   给这个数据库用户ggg,授予查看数据库wcc中的任何定义信息,   这个时候,你可以点击wcc数据库左边的加号,展开目录树,   你可以看到表,视图等等,点击表,你可以看到有很多表  */ grant view definition on database::wcc to ggg 

 


2、接下来,打开客户端工具,输入用户名:ggg 和密码:ggg,进行连接:

 

然后,我们点击左边的目录树,可以查看数据库wcc下面的所有信息:

 

但是如果你点击ggg数据库,由于没有在数据库ggg中建立对应的数据库用户ggg,所以在用登陆账号ggg登录到SQL Server后,会用当前数据库的guest数据库用户,作为登录名的数据库用户,而这个guest没有什么权限,所以导致报错:

 

如果我们尝试进行select查询,由于没有授予数据库用户select 权限,比如:

grant select on test to ggg


所以,下面的代码会报错:

use wcc go   /* 5.需要特别注意的是,上面的权限只能是让你看看定义,   你说,我能:select * from 某个表      由于没有:   grant select on 某个表 to ggg      所以会报没有权限的 */ select * from test