数据库5关系数据库完整性实验

更新时间:2023-11-20 02:23:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

数据库系统原理 实验报告

实验名称:关系数据库完整性实验

任课教师:霍纬刚

学号:100341324

姓名:汪何媛

完成日期:2012.11.28

一、 实验目的

通过ORACLE的完整性,理解关系数据库的完整性

二、 实验内容与步骤

ORACLE环境中通过触发器可以定义为更复杂的完整性约束 例1:通过触发器产生主键值

create sequence ql minvalue 010341416;

create table student(sno number(9) primary key ,sname varchar2(20)); create or replace trigger add_student before insert on student for each row

begin

select ql.nextval into :new.sno from dual; end;

验证触发器:

SQL>insert into student (sname)values(‘刘辉’); SQL>insert into student (sname)values(‘刘俊波’);

例2:创建一个行级触发器,记录下给个用户对数据库的表进行数据操纵的次数 create or replace trigger audit_student after delete or insert or update on student for each row begin

if deleting then

update audit_student set del =del+1

where user_name=user and table_name='student'; end if;

if inserting then

update audit_student set ins=ins+1

where user_name=user and table_name='student'; end if;

if updating then

update audit_student set upd=upd+1;

where user_name =user and table_name='student'; end if ; end;

要求:1)定义基本表:

Audit_student(user_name,table_name,del,ins,upt) 2)输入元组,例“SCOTT”,“student”,0,0,0

3)以SCOTT身份登录,对student表进行增加删除和修改操作,之后查看audit_student表的内容变化。

例3、为教师表Teacher定义完整性规则:“职称(pos)为教授时其工资(sal)不得低于1000元,如果低于1000元,自动改为1000元”。 create or replace trigger update_sal

before insert or update of sal,pos on teacher for each row

when(new.pos='教授') begin

if :new.sal<1000 then :new.sal :=1000; end if;

end;

要求1)建立教师表Teacher。提示:必须包含pos,sal等属性; 2)输入必要的数据; 3 )定义上述触发器

4)更新职称为教授的元组的工资,按照大于1000和小于1000分别进行操作。 5)插入职称为教授的数据行,按照大于1000和小于1000分别进行操作。 6)理解并解释触发器定义的完整性约束。

三、 实验结果与结论

例1、 通过触发器产生主键值

SQLWKS> create sequence ql minvalue 010341416; 语句已处理。

SQLWKS> create table student(sno number(9) primary key,sname varchar2(20)); 语句已处理。

SQLWKS> create or replace trigger add_student 2> before insert on student 3> for each row 4> begin

5> select ql.nextval into:new.sno from dual; 6> end;

7> 语句已处理。

SQLWKS> insert into student(sname) values('汪何媛'); 处理了 1 行。

SQLWKS> insert into student(sname) values('刘明杭'); 处理了 1 行。

SQLWKS> insert into student(sname) values('李昕'); 处理了 1 行。

SQLWKS> insert into student(sname) values('刘俊'); 处理了 1 行。

SQLWKS> insert into student(sname) values('蒋帆'); 处理了 1 行。 验证触发器:

SQLWKS> select * from student 2>

SNO SNAME ---------- --------------------

10341416 汪何媛

10341417 10341418 10341419 10341420

刘明杭 李昕 刘俊 蒋帆

已选择5行。

例2、 创建一个行级触发器,记录下给个用户对数据库的表进行数据操纵的次数 定义基本表:

SQLWKS> create table audi_student(user_name varchar2(20) primary key,table_name varchar2(20),del number(9),ins number(9),upd number(9)); 语句已处理。

定义触发器:

SQLWKS> create or replace trigger audi_student 2> after delete or insert or update on student 3> for each row 4> begin

5> if deleting then

6> update audi_student set del=del+1

7> where user_name=user and table_name='student'; 8> end if;

9> if inserting then

10> update audi_student set ins=ins+1

11> where user_name=user and table_name='student'; 12> end if;

13> if updating then

14> update audi_student set upd=upd+1

15> where user_name=user and table_name='student'; 16> end if; 17> end; 18> 语句已处理。 验证触发器:

SQLWKS> select * from audi_student 2>

USER_NAME TABLE_NAME DEL INS UPD

-------------------- -------------------- ---------- ---------- ---------- 已选择0行。 输入元组:

SQLWKS> insert into audi_student values('SCOTT','student',0,0,0); 处理了 1 行。

SQLWKS> insert into audi_student values('Scott','汪何媛',0,0,0);

处理了 1 行。 显示:

SQLWKS> select * from audi_student 2>

USER_NAME TABLE_NAME DEL INS UPD

-------------------- -------------------- ---------- ---------- ----------

SCOTT student 0 0 0 Scott 汪何媛 0 0 0 已选择2行。 添加操作:

SQLWKS> insert into audi_student values('WHY','李昕',1,1,2); 处理了 1 行。

SQLWKS> select * from audi_student

2>

USER_NAME TABLE_NAME UPD

-------------------- -------------------- ---------- ---------- ----------

SCOTT student 0 Scott 汪何媛 0 WHY 李昕 2

已选择3行。

SQLWKS> insert into student(sname) values('凯莉') 2>

处理了 1 行。

SQLWKS> insert into student(sname) values('戴安娜') 2>

处理了 1 行。

SQLWKS> insert into student(sname) values('维多利亚') 2>

处理了 1 行。

SQLWKS> insert into student(sname) values('大卫') 2>

处理了 1 行。

SQLWKS> select * from student 2>

SNO SNAME ---------- --------------------

10341416 汪何媛 10341417 刘明杭 10341418 李昕 10341419 刘俊 10341420 蒋帆

DEL INS 0 0 0 0

1 1

本文来源:https://www.bwwdw.com/article/2zwv.html

Top