目录
[例4.1] 把查询Student表权限授给用户U1定操作权限授予指定的用户
[例4.2] 把对Student表和Course表的全部权限授予用户U2和U3
[例4.4] 把查询Student表和修改学生学号的权限授给用户U4
[例4.5] 把对表SC的INSERT权限授予U5用户,并允许他再将此权限授予其他用户
4.2.3 自主存取控制方法
关系数据库系统中存取控制对象
对象类型 | 对象 | 操 作 类 型 |
数据库
模式 | 模式 | CREATE SCHEMA |
基本表 | CREATE TABLE,ALTER TABLE | |
视图 | CREATE VIEW | |
索引 | CREATE INDEX | |
数据 | 基本表和视图 | SELECT,INSERT,UPDATE,DELETE,REFERENCES, ALL PRIVILEGES |
属性列 | SELECT,INSERT,UPDATE, REFERENCES,ALL PRIVILEGES |
1.GRANT
WITH GRANT OPTION子句:
指定:可以再授予
没有指定:不能传播
语义:将对指定操作对象的指
以下需要建立很多的用户,但是问题就来了。
网络上这么说的:
同一数据库中,一个登录只能对应一个用户
一个登录,在不同的数据库中,允许对应不同的用户
!所以啊,选择不同的登录名建立以下的用户,对的,下面的题目要使用。
[例4.1] 把查询Student表权限授给用户U1定操作权限授予指定的用户
标准SQL是在SQLserve中是错误的。以下语句会报错,形式如下:
消息 156,级别 15,状态 1,第 6 行
关键字 'TO' 附近有语法错误。
grant select
on table Student
to U1;
正确的写法为:
grant select
on Student
to U1;
如何查看是否将权限授予成功呢?
右击该用户,选择属性。
右下角可查看已有属性。
以上新建立的用户,默认都是无权限。
[例4.2] 把对Student表和Course表的全部权限授予用户U2和U3
grant all privileges
on Student,Course
to U2,U3;
错误如下:
消息 102,级别 15,状态 1,第 2 行
“,”附近有语法错误。
原因:grant语句一次只能对一个对象进行赋权,不能同时对两个表进行赋权;但是我们可以同时赋给对象多个不同的权限。
所以在我的SQLserve中,可以使用以下语句进行授权。
grant all privileges
on Student
to U2,U3;
grant all privileges
on Course
to U2,U3;
但是依旧会有以下的提示。。。
ALL 权限已不再推荐使用,并且只保留用于兼容性目的。它并不表示对实体定义了 ALL 权限。
ALL 权限已不再推荐使用,并且只保留用于兼容性目的。它并不表示对实体定义了 ALL 权限。
现在再次查看U2,U3到底有多少的权限,插入,更新,删除,选择,引用。
[例4.3] 把对表SC的查询权限授予所有用户
grant select
on SC
to public;
[例4.4] 把查询Student表和修改学生学号的权限授给用户U4
grant update(Sno),select
on Student
to U4;
对属性列的授权时必须明确指出相应属性列名
[例4.5] 把对表SC的INSERT权限授予U5用户,并允许他再将此权限授予其他用户
加上最后一句话,就允许该用户将自己的权限全部或者部分的授予给其他用户。
grant insert
on SC
to U5
with grant option;
U5不仅拥有了对表SC的INSERT权限,
还可以传播此权限:
[例4.6]
grant insert
on SC
to U6
with grant option;
同样,U6还可以将此权限授予U7:
[例4.7]
grant insert
on SC
to U7;
授权用户名 | 被授权用户名 | 数据库对象名 | 允许的操作类型 | 能否转授权 |
DBA | U1 | 关系Student | SELECT | 不能 |
DBA | U2 | 关系Student | ALL | 不能 |
DBA | U2 | 关系Course | ALL | 不能 |
DBA | U3 | 关系Student | ALL | 不能 |
DBA | U3 | 关系Course | ALL | 不能 |
DBA | PUBLIC | 关系SC | SELECT | 不能 |
DBA | U4 | 关系Student | SELECT | 不能 |
DBA | U4 | 属性列Student.Sno | UPDATE | 不能 |
DBA | U5 | 关系SC | INSERT | 能 |
U5 | U6 | 关系SC | INSERT | 能 |
U6 | U7 | 关系SC | INSERT | 不能 |
2.REVOKE
[例4.8]把用户U4修改学生学号的权限收回
revoke update(Sno)
on Student
from U4;
[例4.9] 收回所有用户对表SC的查询权限号的权限收回
revoke select
on SC
from public;
[例4.10] 把用户U5对SC表的INSERT权限收回
revoke insert
on SC
from U5 cascade;
此时U5用户没有任何权限了。
4.2.5 数据库角色
角色(ROLE):
被命名的一组与数据库操作相关的权限
角色是权限的集合。可以为一组具有相同权限的用户创建一个角色。
优点:简化授权的过程。
[例4.11] 通过角色来实现将一组权限授予一个用户。
步骤如下:
(1)首先创建一个角色 R1
create role R1
(2)然后使用GRANT语句,使角色R1拥有Student表的 SELECT、UPDATE、INSERT权限
grant select,update,insert
on Student
to R1;
选择右上角的安全对象。可以查看R1的权限。
(3)将这个角色授予王平,张明,赵玲。使他们具有角色R1所包含的全部权限
grant R1
to 王平,张明,赵玲;
错误。。【濒临崩溃的瞬间,昨天晚上写到这里的时候断电了,,,我裂开了,怎么这么多问题】
消息 102,级别 15,状态 1,第 9 行
“R1”附近有语法错误。
下面的语句是可以在SQLserve上面运行的。
alter role R1
add member 王平;
alter role R1
add member 张明;
alter role R1
add member 赵玲;
按照属性找到他的身份,以上三个用户就拥有R1角色的全部权限。
同样的,角色成员也可以找到。
(4) 可以一次性通过R1来回收王平的这3个权限
revoke R1
to 王平;
有以下提示:
消息 102,级别 15,状态 1,第 8 行
“R1”附近有语法错误。
正确的:
exec sp_droprolemember 'R1','王平';
已经成功收回王平的权限。
[例4.12] 角色的权限修改
grant delete
on Student
to R1;
使角色R1在原来的基础上增加了Student表的DELETE 权限
[例4.13]
revoke select
on Student
from R1;
使R1减少了SELECT权限
心得
。又一次写了好久的博客,目前感到万分的心累,还有一个作业没有写啊~~~
T-SQL和标准SQL的差距其实还是蛮大的,起码在这篇博客涉及的方面有很大的不同,课上的代码都有大大小小的修改。
完结,撒花!
好想坐沙发。。。