数据库原理实验实验四 oracle的安全性和完整性控制

实验四 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所有的创建用户删除用户等权限,所以对于每一个用户都有了这些权限。

 

 

 

 

你可能感兴趣的:(数据库,数据库,oracle,安全性,完整性)