前言:
说数据库权限控制,首先简单了解下数据库中存在的两种角色:服务器角色和数据库角色。
服务器角色:
内置服务器角色 | 说明 |
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)
*/
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) 通过权限控制,实现: login1对testdb中test1只有select权限
2)精确控制login2仅对test2中的某一列有select权限
上述准备工作做好后:
第一步:
在testdb数据库下->安全性->用户-》右击
分别建立user1,user2
user1关联登陆账户login1
user2关联登陆账户login2
参考如下图:
数据库用户user2设置同user1,参考上图,这里就不截图了
未对user1授权时,通过login1登陆到服务器,并建立对testdb数据库的查询
结果如下:
第二步,开始对user1,user2设置权限:
设置user1的权限
确定后,如下图:
确定后,我们就可以看到test1,test2了,点击test1,勾选授予select,点击test2勾选deny select权限具体如下图:
此时我们再执行select时,结果如下:
2)如果要控制user2只能访问test2的col2而不能访问col1,除了对user2设置上述操作外,我们还应该设置如下:
以login2登陆服务器后运行结果如下:
总结:
个人觉得,总体把握sqlserver的授权机制比较重要,比如一个登陆账户是要关联到对应的数据库用户才能访问数据库,具体对数据库有没什么权限,取决于数据库用户是什么数据库角色的成员。把这个问题弄清楚了,很多设置其实思路应该就清晰多了。