在SQLServer中实现自主存取控制的授权部分

1. 说在前面

实现授权(authorization),只需要通过GRANTREVOKE语句给某一数据库下的由用户名(username)表示的用户授权即可。但是我发现在SQL server中存在着登录名(login),用户名等概念,通过GRANTREVOKE语句授权需要用户名,而用户名又需要登录名,因此对这两个概念的准确把握是很重要的。

2. 登录名和用户名的区别

在SQL server中,登录名(login)是用在访问DBMS时起到一个验证身份的作用(authentication),它只是能登录进DBMS,但是默认状态下对DBMS中的数据库是没有任何权限的。同时,对登录名赋予的权限是DBMS级别的,也就是说这个登录名如果可以访问数据库,那么对登录名赋予的权限将影响到这个登录名下属的每一个数据库。

有了登录名,还要有权限才能访问数据库。而赋权是以数据库为单位进行的,数据库通过新增用户名的方式,将该新增的用户名与上文的登录名绑定,实现登录名到用户名的映射(一个不严谨的说法,相当于这个数据库给某个登录名一个“许可证”,从此,这个登录名在这个数据库这算是有头有脸的人了)。一个登录名能有多大权力要看有多少数据库愿意给他“许可证”了,一个登录名手上的许可证越多,那么他能访问的数据库也越多。不过,有了许可证也不是啥都能干,数据库会对每个用户名分配相应的权限,具体给什么样的权限取决于数据库的创建者或者DBA。通过前面的分析,我们知道用户名是数据库层面的,赋予的权限也是仅仅对单个数据库而言。

一个登录名可以对应多个用户名(相当于在不同的数据库那拿许可证嘛),但是在一个数据库中只能有一个用户名。

3.具体怎么做

前面说了一大堆概念,下面说具体怎么做,以下都是通过SQL代码实现的

3.1. 新建登录名

1
2
CREATE LOGIN loginname   
WITH PASSWORD = 'pass'

将上面的loginnamepass换成自己想设置的登录名,密码即可。

3.2. 新建用户名

1
CREATE USER username FOR LOGIN loginname;

将上面的loginnameusername换成自己想设置的登录名,用户名即可。登录名和用户名可以相同,可以不同,取决于个人。

3.3. 通过GRANT和REVOKE授权和收回

3.3.1. GRANT语法

1
2
3
4
GRANT <权限>[,<权限>]···
ON <对象名>
TO <用户>[,<用户>]···
[WITH GRANT OPTION]

3.3.2. REVOKE语法

1
2
3
4
REVOKE <权限>[,<权限>]···
ON <对象名>
FROM <用户>[,<用户>]···
[CASCADE|RESTRICT]