关于对表的读写权限的控制示例演示

前言:

      说数据库权限控制,首先简单了解下数据库中存在的两种角色:服务器角色和数据库角色。

      服务器角色:

内置服务器角色 说明
sysadmin 系统管理员,拥有sql server所有的权限许可。
serveradmin 服务器管理员,管理sql server服务器端设置
setupadmin 设置管理员,管理链接服务器和启动过程,建立数据库复制以及管理扩展存储过程
securityadmin 安全管理员,管理登录和create database权限,读取错误日志和更改密码
processadmin 进程管理员,管理在sql server中运行的进程
dbcreator 数据库创建者,创建、更改和删除数据库
diskadmin 磁盘管理员,管理磁盘文件
bulkadmin 可执行大容量数据添加操作语句(bulk insert)

       数据库角色:

内置数据库角色 说明
public 为数据库用户维护默认的许可权限,每个用户都是public角色的成员
db_owner 数据库所有者
db_accessadmin 数据库访问管理员,可添加或删除数据库用户
db_ddladmin 数据库DDL管理员,可添加、修改或除去数据中的对象
db_securityadmin 数据库安全管理员,管理数据库的角色和成员、管理数据库中语句和对象的权限
db_backupoperator 数据库备份操作员
db_datareader 数据库数据读取者
db_datawritter 数据库数据写入者,可添加、更改或删除数据库中的所有数据
db_denydatareader 数据库拒绝数据读取者
db_denydatawriter 数据库拒绝数据写入者

          服务器角色控制服务器级别的权限,数据库角色控制数据库内数据对象的权限。在数据库中,存在两种账户,一个是登陆账户,一个是数据库用户,两者区别显而易见。

登陆账户是登陆到服务器,虽然具备对服务器具有相应的权限,并不意味着登陆账户对数据库就有相应的权限。当一个用户想访问数据库内的数据对象时,这时候数据库用户就发挥作用,因为数据库用户可以对相应数据库具有一定的操作权限,那么sqlserver中,只要在数据库中添加相应的数据库用户,使其关联到指定的登陆账户,即可实现登陆账户访问具体的数据库,通过对数据库用户授权来控制登陆账户的权限。

在Sql server中,有两个默认的数据库用户,即dbo和guest。dbo用户存在于每个数据库下,是数据库管理员,它对应的登录账户是sa,如果某个sql server登录账户是sysadmin角色的成员并且该账户没有映射用户账户时,系统将自动将其映射为每个数据库中的dbo用户。guest用户则默认被加入到master、tempdb等系统数据库中。


实例演示:

环境说明:

Microsoft SQL Server 2005 - 9.00.1399.06 (X64) 
	Oct 14 2005 00:35:21 
/*	Copyright (c) 1988-2005 Microsoft Corporation
	Developer Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1)
*/

sqlserver中有数据库testdb,数据库中有表test1 ,test2

test1(col1,col2)

test2(col1,clo2)

创建代码如下:

if not exists(select * from sys.databases where name='testdb')
create database testdb
go

use testdb
go

create table test1
(col1 int,
 col2 int
)

go

create table test2
(
 col1 int,
 col2 int
)

insert into test1
select 0,1 union
select 2,3 union
select 4,5

insert into test2
select 2,4 union
select 3,5 union
select 6,6


management studio->安全性->登陆名-》右击

分别新建两个登陆账户:login1,login2 

关于对表的读写权限的控制示例演示_第1张图片

关于对表的读写权限的控制示例演示_第2张图片


需求:

       1) 通过权限控制,实现: login1对testdb中test1只有select权限

       2)精确控制login2仅对test2中的某一列有select权限

上述准备工作做好后:

第一步:

 在testdb数据库下->安全性->用户-》右击

分别建立user1,user2

user1关联登陆账户login1

user2关联登陆账户login2

参考如下图:

关于对表的读写权限的控制示例演示_第3张图片


数据库用户user2设置同user1,参考上图,这里就不截图了

未对user1授权时,通过login1登陆到服务器,并建立对testdb数据库的查询

结果如下:

关于对表的读写权限的控制示例演示_第4张图片

第二步,开始对user1,user2设置权限:

设置user1的权限

关于对表的读写权限的控制示例演示_第5张图片

确定后,如下图:

关于对表的读写权限的控制示例演示_第6张图片

确定后,我们就可以看到test1,test2了,点击test1,勾选授予select,点击test2勾选deny select权限具体如下图:

关于对表的读写权限的控制示例演示_第7张图片


此时我们再执行select时,结果如下:

关于对表的读写权限的控制示例演示_第8张图片


2)如果要控制user2只能访问test2的col2而不能访问col1,除了对user2设置上述操作外,我们还应该设置如下:

关于对表的读写权限的控制示例演示_第9张图片

以login2登陆服务器后运行结果如下:

关于对表的读写权限的控制示例演示_第10张图片


总结:

         个人觉得,总体把握sqlserver的授权机制比较重要,比如一个登陆账户是要关联到对应的数据库用户才能访问数据库,具体对数据库有没什么权限,取决于数据库用户是什么数据库角色的成员。把这个问题弄清楚了,很多设置其实思路应该就清晰多了。



你可能感兴趣的:(权限控制)