实验四 oracle的安全性和完整性控制
实验目的:
1. 通过本实验能够熟练应用sql语言进行用户权限的授予和回收。
2. 熟练掌握实体完整性,参照完整性及用户定义的完整性的定义。
3. 并体会oracle数据库系统在安全性和完整性保护方面的特性。
实验要求:
1. 在进行本实验之前,应熟练课程内容,在上机之前做好实验计划,编写好相应的代码。
实验内容:
Grant 语句的格式:
Grant <权限> [,<权限>]…
On <对象名>
To <用户> [,<用户>]…
[with grant option]
Public 全体用户
如果指定了[with grant option],则获得某种权限的用户还可以把这种权限再授予其他用户。但不允许循环授权。
(一) 授权
1. 以dba用户的身份登陆oracle,创建用户u1+学号后四位,u2+学号后四位。
createuser u1_4128 IDENTIFIEDBY j123456;
createuser u2_4128 IDENTIFIEDBY j123456;
2. 对1.中创建的用户授予connect,resource的权限。
SQL> grant connect to u1_4128,u2_4128;
Grantsucceeded
SQL> grant resource to u1_4128,u2_4128;
Grantsucceeded
或者:
SQL> grant connect,resource to u1_4128,u2_4128;
Grantsucceeded
3. 用户jsj***把查询Student表权限授给用户u1+学号后四位,u1执行相应的查询。
SQL> grant select on student to u1_4128;
Grantsucceeded
1) 查询jsj***用户的全体学生的详细记录。
登录u1_4128用户后
SQL> select * from j2014224128.student;
SNO SNAME SSEX SAGE SDEPT
--------- -------- ---- ---- --------------------
20070001 李佳 女 20 MA
20070003 王添 男 18 MA
20070004 张力 女 21 IS
20070005 张力 女 19 CS
20070006 张力 男 19 MA
224128 庞振男 女 20 IT
224129 庞阿男 男 22 MA
1254 nana lal
8 rows selected
2) 查询jsj***用户的所有姓刘的学生的姓名、学号和性别。(张)
SQL> select sname,sno,ssex from j2014224128.student where sname like '张%';
SNAME SNO SSEX
-------- --------- ----
张力 20070004 女
张力 20070005 女
张力 20070006 男
3) 查询jsj***用户的名字中第二字为“勇”字的学生的姓名和学号。(振)
SQL> select sname,sno from j2014224128.student where sname like '_振%';
SNAME SNO
-------- ---------
庞振男 224128
4. 用户jsj***把对Student表和Course表的全部权限授予用户u2+学号后四位,u3+学号后四位;u2+学号后四位用户修改jsj***的数据。
登录原用户j014224128
createuser u3_4128 IDENTIFIEDBY j123456;
SQL> grant all privileges on student to u2_4128,u3_4128;
Grant succeeded
SQL> grant all privileges on course to u2_4128,u3_4128;
Grant succeeded
登录用户u2_4128
SQL> insert intoj2014224128.student(sno,sname,ssex,sage,sdept)values(20140001,'Jack','男',20,'IT');
1 row inserted
登录用户j2014224128
SQL> select * from student;
SNO SNAME SSEX SAGE SDEPT
--------- -------- ---- ---- --------------------
20070001 李佳 女 20 MA
20070003 王添 男 18 MA
20070004 张力 女 21 IS
20070005 张力 女 19 CS
20070006 张力 男 19 MA
224128 庞振男 女 20 IT
224129 庞阿男 男 22 MA
1254 nana lal
20140001 Jack 男 20 IT
9 rows selected
修改数据完成
SQL> drop user u3_4128;
User dropped
5. 把对表SC的查询权限授予所有用户。
1) 查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列
登录用户j2014224128
SQL> grant select on sc to public;
Grant succeeded
随意登录一个用户u1_4128
SQL> select sno,grade from j2014224128.sc where cno=3 order by gradeDESC;
SNO GRADE
--------- -----
20070001 88
20070003 80
20070002 80
2) 查询各个课程号与相应的选课人数。
SQL> select cno,count(*) from j2014224128.sc group by cno;
CNO COUNT(*)
----- ----------
1 13
6 1
2 3
4 3
5 2
3 3
7 1
10 1
8 rows selected
6. 用户jsj***授予用户u4+学号后四位对student表的insert权限,并允许此权限传播。
登录用户j2014224128
createuser u4_4128 IDENTIFIEDBY j123456;
SQL> grant insert on student to u4_4128 with grant option;
Grant succeeded
7. 用户u4+学号后四位将对表student的insert权限授予u5+学号后四位,并允许将权限转授给其他用户。(首先应该以u5+学号后四位的身份重新登陆数据库,然后再进行授权)
登录用户u4_4128
createuser u5_4128 IDENTIFIEDBY j123456;
SQL> grant insert on j2014224128.student to u5_4128 with grant option;
Grant succeeded
授权成功!
SQL> drop user u5_4128;
User dropped
(二) 回收权限
1.收回所有用户对表sc的查询权限
在用户u4_4128下进行的操作
SQL> revoke all privileges on j2014224128.sc from public;
Revoke succeeded
退出登录后进入j2014224128用户后
执行:
SQL> revoke all privileges on sc from public;
Revoke succeeded
收回授权成功!
2. 收回用户u4对student表的insert权限
在j2014224128用户下
SQL> revoke insert on j2014224128.student from u4_4128;
Revoke succeeded
3. 在回收权限之后验证用户是否真正丧失了该权限(查询表,插入记录)
进入用户u4_4128
验证1:
SQL> select * from j2014224128.sc;
select * from j2014224128.sc
ORA-00942: 表或视图不存在
验证2:
SQL> insert into j2014224128.student(sno,sname) values(10011,'June');
insert into j2014224128.student(sno,sname) values(10011,'June')
ORA-00942: 表或视图不存在
使用用户完毕,进行删除即可,防止数据库负荷太重。
SQL> drop user u1_4128;
User dropped
SQL> drop user u2_4128;
User dropped
SQL> drop user u4_4128;
drop user u4_4128
ORA-01940: 无法删除当前已连接的用户
登录用户j2014224128之后再次执行
SQL> drop user u4_4128;
User dropped
(三) 角色
1. 创建一个角色
SQL> create role pang;
Role created
2. 给角色授予权限
SQL> grant select on student to pang;
Grant succeeded
3. 将角色授予某一用户
4. 检查用户是否具有相应的权限
3.4答案一起:
01.创建一个新的用户u2_4128
createuser u2_4128 identifiedby j123456;
02.判断此用户是否有select的权限
登录u2_4128之后:
SQL> conn u2_4128/j123456;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as u2_4128
SQL> select * from j2014224128.student;
select * from j2014224128.student
ORA-00942: 表或视图不存在
表示此新用户还不具有相应select权限
03.重新登录用户j2014224128后,将角色授予u2_4128用户
SQL> conn j2014224128/j123456;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as j2014224128
SQL> grant pang to u2_4128;
Grant succeeded
04.此时检查u2_4128用户是否具有该select权限
SQL> conn u2_4128/j123456;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as u2_4128
SQL> select * from j2014224128.student;
SNO SNAME SSEX SAGE SDEPT
--------- -------- ---- ---- --------------------
20070001 李佳 女 20 MA
20070003 王添 男 18 MA
20070004 张力 女 21 IS
20070005 张力 女 19 CS
20070006 张力 男 19 MA
224128 庞振男 女 20 IT
224129 庞阿男 男 22 MA
1254 nana lal
20140001 Jack 男 20 IT
9 rows selected
表示该用户已经具有了该select权限
(四) 完整性
1.建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码
createtabledept(dname varchar(20) unique,deptno varchar(20) primarykey);
2.建立学生登记表Student,要求学号在9000至9999之间,年龄<29,性别只能是’男’或’女’,姓名非空。
createtable login_student(sno varchar(20) constraint ck_sno check(sno>=9000and sno<=9999),
sname varchar(20) notnull,
ssex varchar(2) constraint ck_sex check (ssex in('男','女')),
ssage number(3) constraint ck_sage check(ssage<29)
);
3.修改表Student的结构,由年龄小于29改为小于40。
方法1:(十分牵强)
SQL> alter table login_student modify ssage number(5) constraintck_sage1 check(ssage<40);
Table altered
此时约束条件有两个,不是十分合理。
方法2:
SQL> alter table login_student drop constraint ck_sage;
Table altered
先删除原来的约束
SQL> alter table login_student add constraint ck_sage check(ssage<40);
Table altered
再建立之后修改过的新的约束
4.建立职工表EMP,要求每个职工的应发工资不得超过3000元。应发工资实际上就是实发工资列Sal与扣除项Deduct之和。
对上述新建立和修改定义的表,每个表输入3条数据,其中1条数据符合完整性约束,2条违反约束条件的,验证和体会Oracle的实体完整性和参照完整性。
createtable emp(eno varchar(20),sal number(5),deduct number(5),
constraint yueshu check((sal+deduct)<=3000));
SQL> insert into emp(eno,sal,deduct)values(1001,20,200);
1 row inserted
SQL> insert into emp(eno,sal,deduct)values(1002,2000,2000);
insert intoemp(eno,sal,deduct)values(1002,2000,2000)
ORA-02290: 违反检查约束条件(J2014224128.YUESHU)
SQL> insert into emp(eno,sal,deduct)values(1003,3000,1);
insert intoemp(eno,sal,deduct)values(1003,3000,1)
ORA-02290: 违反检查约束条件(J2014224128.YUESHU)
创建用户和授予权限的步骤要分开,一次只能在一个表中进行权限授予,但可以一次对多个用户进行权限授予。
由于为了方便广大用户进行相应操作,DBA用户给定了public所有的创建用户删除用户等权限,所以对于每一个用户都有了这些权限。