数据库系统原理实验报告实验名称:关系数据库完整性实验任课教师:***学号:*********姓名:***完成日期: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_studentbefore insert on studentfor each rowbeginselect 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_studentafter delete or insert or update on studentfor each rowbeginif deleting thenupdate audit_student set del =del+1where user_name=user and table_name='student';end if;if inserting thenupdate audit_student set ins=ins+1where user_name=user and table_name='student';end if;if updating thenupdate 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,03)以SCOTT身份登录,对student表进行增加删除和修改操作,之后查看audit_student表的内容变化。
例3、为教师表Teacher定义完整性规则:“职称(pos)为教授时其工资(sal)不得低于1000元,如果低于1000元,自动改为1000元”。
create or replace trigger update_salbefore insert or update of sal,pos on teacherfor each rowwhen(new.pos='教授')beginif :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_student2> before insert on student3> for each row4> begin5> 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 student2>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_student2> after delete or insert or update on student3> for each row4> begin5> if deleting then6> update audi_student set del=del+17> where user_name=user and table_name='student';8> end if;9> if inserting then10> update audi_student set ins=ins+111> where user_name=user and table_name='student';12> end if;13> if updating then14> update audi_student set upd=upd+115> where user_name=user and table_name='student';16> end if;17> end;18>语句已处理。
验证触发器:SQLWKS> select * from audi_student2>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_student2>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_student2>USER_NAME TABLE_NAME DEL INS UPD-------------------- -------------------- ---------- ---------- ----------SCOTT student 0 0 0 Scott 汪何媛0 0 0 WHY 李昕 1 1 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 student2>SNO SNAME---------- --------------------10341416 汪何媛10341417 刘明杭10341418 李昕10341419 刘俊10341420 蒋帆10341422 戴安娜10341423 维多利亚10341424 大卫已选择9行。
删除操作:SQLWKS> delete from student where sname='大卫';处理了1 行。