数据库5关系数据库完整性实验.docx
- 文档编号:16631435
- 上传时间:2023-07-15
- 格式:DOCX
- 页数:16
- 大小:18.04KB
数据库5关系数据库完整性实验.docx
《数据库5关系数据库完整性实验.docx》由会员分享,可在线阅读,更多相关《数据库5关系数据库完整性实验.docx(16页珍藏版)》请在冰点文库上搜索。
数据库5关系数据库完整性实验
数据库系统原理
实验报告
实验名称:
关系数据库完整性实验
任课教师:
***
学号:
*********
*******
完成日期:
2012.11.28
一、实验目的
通过ORACLE的完整性,理解关系数据库的完整性
二、实验内容与步骤
ORACLE环境中通过触发器可以定义为更复杂的完整性约束
例1:
通过触发器产生主键值
createsequenceqlminvalue010341416;
createtablestudent(snonumber(9)primarykey,snamevarchar2(20));
createorreplacetriggeradd_student
beforeinsertonstudent
foreachrow
begin
selectql.nextvalinto:
new.snofromdual;
end;
验证触发器:
SQL>insertintostudent(sname)values(‘刘辉’);
SQL>insertintostudent(sname)values(‘刘俊波’);
例2:
创建一个行级触发器,记录下给个用户对数据库的表进行数据操纵的次数
createorreplacetriggeraudit_student
afterdeleteorinsertorupdateonstudent
foreachrow
begin
ifdeletingthen
updateaudit_studentsetdel=del+1
whereuser_name=userandtable_name='student';
endif;
ifinsertingthen
updateaudit_studentsetins=ins+1
whereuser_name=userandtable_name='student';
endif;
ifupdatingthen
updateaudit_studentsetupd=upd+1;
whereuser_name=userandtable_name='student';
endif;
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元”。
createorreplacetriggerupdate_sal
beforeinsertorupdateofsal,posonteacher
foreachrow
when(new.pos='教授')
begin
if:
new.sal<1000then
:
new.sal:
=1000;
endif;
end;
要求1)建立教师表Teacher。
提示:
必须包含pos,sal等属性;
2)输入必要的数据;
3)定义上述触发器
4)更新职称为教授的元组的工资,按照大于1000和小于1000分别进行操作。
5)插入职称为教授的数据行,按照大于1000和小于1000分别进行操作。
6)理解并解释触发器定义的完整性约束。
三、实验结果与结论
例1、通过触发器产生主键值
SQLWKS>createsequenceqlminvalue010341416;
语句已处理。
SQLWKS>createtablestudent(snonumber(9)primarykey,snamevarchar2(20));
语句已处理。
SQLWKS>createorreplacetriggeradd_student
2>beforeinsertonstudent
3>foreachrow
4>begin
5>selectql.nextvalinto:
new.snofromdual;
6>end;
7>
语句已处理。
SQLWKS>insertintostudent(sname)values('汪何媛');
处理了1行。
SQLWKS>insertintostudent(sname)values('刘明杭');
处理了1行。
SQLWKS>insertintostudent(sname)values('李昕');
处理了1行。
SQLWKS>insertintostudent(sname)values('刘俊');
处理了1行。
SQLWKS>insertintostudent(sname)values('蒋帆');
处理了1行。
验证触发器:
SQLWKS>select*fromstudent
2>
SNOSNAME
------------------------------
10341416汪何媛
10341417刘明杭
10341418李昕
10341419刘俊
10341420蒋帆
已选择5行。
例2、创建一个行级触发器,记录下给个用户对数据库的表进行数据操纵的次数
定义基本表:
SQLWKS>createtableaudi_student(user_namevarchar2(20)primarykey,table_namevarchar2(20),delnumber(9),insnumber(9),updnumber(9));
语句已处理。
定义触发器:
SQLWKS>createorreplacetriggeraudi_student
2>afterdeleteorinsertorupdateonstudent
3>foreachrow
4>begin
5>ifdeletingthen
6>updateaudi_studentsetdel=del+1
7>whereuser_name=userandtable_name='student';
8>endif;
9>ifinsertingthen
10>updateaudi_studentsetins=ins+1
11>whereuser_name=userandtable_name='student';
12>endif;
13>ifupdatingthen
14>updateaudi_studentsetupd=upd+1
15>whereuser_name=userandtable_name='student';
16>endif;
17>end;
18>
语句已处理。
验证触发器:
SQLWKS>select*fromaudi_student
2>
USER_NAMETABLE_NAMEDELINSUPD
----------------------------------------------------------------------
已选择0行。
输入元组:
SQLWKS>insertintoaudi_studentvalues('SCOTT','student',0,0,0);
处理了1行。
SQLWKS>insertintoaudi_studentvalues('Scott','汪何媛',0,0,0);
处理了1行。
显示:
SQLWKS>select*fromaudi_student
2>
USER_NAMETABLE_NAMEDELINSUPD
----------------------------------------------------------------------
SCOTTstudent000
Scott汪何媛000
已选择2行。
添加操作:
SQLWKS>insertintoaudi_studentvalues('WHY','李昕',1,1,2);
处理了1行。
SQLWKS>select*fromaudi_student
2>
USER_NAMETABLE_NAMEDELINSUPD
----------------------------------------------------------------------
SCOTTstudent000
Scott汪何媛000
WHY李昕112
已选择3行。
SQLWKS>insertintostudent(sname)values('凯莉')
2>
处理了1行。
SQLWKS>insertintostudent(sname)values('戴安娜')
2>
处理了1行。
SQLWKS>insertintostudent(sname)values('维多利亚')
2>
处理了1行。
SQLWKS>insertintostudent(sname)values('大卫')
2>
处理了1行。
SQLWKS>select*fromstudent
2>
SNOSNAME
------------------------------
10341416汪何媛
10341417刘明杭
10341418李昕
10341419刘俊
10341420蒋帆
10341421凯莉
10341422戴安娜
10341423维多利亚
10341424大卫
已选择9行。
删除操作:
SQLWKS>deletefromstudentwheresname='大卫';
处理了1行。
SQLWKS>select*fromstudent
2>
SNOSNAME
------------------------------
10341416汪何媛
10341417刘明杭
10341418李昕
10341419刘俊
10341420蒋帆
10341421凯莉
10341422戴安娜
10341423维多利亚
已选择8行。
SQLWKS>select*fromaudi_student
2>
USER_NAMETABLE_NAMEDELINSUPD
----------------------------------------------------------------------
SCOTTstudent140
Scott汪何媛000
WHY李昕112
已选择3行。
SQLWKS>updatestudentsetsname='巍然'wheresno=10341420;
处理了1行。
SQLWKS>select*fromstudent
2>
SNOSNAME
------------------------------
10341416汪何媛
10341417刘明杭
10341418李昕
10341419刘俊
10341420巍然
10341421凯莉
10341422戴安娜
10341423维多利亚
已选择8行。
SQLWKS>select*fromaudi_student
2>
USER_NAMETABLE_NAMEDELINSUPD
----------------------------------------------------------------------
SCOTTstudent141
Scott汪何媛000
WHY李昕112
已选择3行。
修改操作:
SQLWKS>updatestudentsetsname='布丁'wheresno=10341421;
处理了1行。
SQLWKS>select*fromstudent
2>
SNOSNAME
------------------------------
10341416汪何媛
10341417刘明杭
10341418李昕
10341419刘俊
10341420巍然
10341421布丁
10341422戴安娜
10341423维多利亚
已选择8行。
SQLWKS>select*fromaudi_student
2>
USER_NAMETABLE_NAMEDELINSUPD
----------------------------------------------------------------------
SCOTTstudent142
Scott汪何媛000
WHY李昕112
已选择3行。
例3、为教师表Teacher定义完整性规则:
“职称(pos)为教授时其工资(sal)不得低于1000元,如果低于1000元,自动改为1000元”。
建立教师表:
SQLWKS>createtableteacher(tnamevarchar2(20)primarykey,posvarchar2(20),salnumber(9));
语句已处理。
输入必要数据:
SQLWKS>createtableteacher(tnamevarchar2(20)primarykey,posvarchar2(20),salnumber(9));
语句已处理。
SQLWKS>insertintoteachervalues('王鸿军','教授','6000');
处理了1行。
SQLWKS>insertintoteachervalues('力宏','讲师','4000');
处理了1行。
SQLWKS>insertintoteachervalues('于丹','教授','6000');
处理了1行。
SQLWKS>select*fromteacher
2>
TNAMEPOSSAL
--------------------------------------------------
王鸿军教授6000
力宏讲师4000
于丹教授6000
已选择3行。
SQLWKS>insertintoteachervalues('潘数','教授','800');
处理了1行。
SQLWKS>select*fromteacher
2>
TNAMEPOSSAL
--------------------------------------------------
王鸿军教授6000
力宏讲师4000
于丹教授6000
潘数教授800
已选择4行。
定义触发器:
SQLWKS>createorreplacetriggerupdatesal
2>beforeinsertorupdateofsal,posonteacher
3>foreachrow
4>when(new.pos='教授')
5>begin
6>if:
new.sal<1000then
7>:
new.sal:
=1000;
8>endif;
9>end;
10>
语句已处理。
更新操作:
1.大于1000
SQLWKS>insertintoteachervalues('潘数','教授','800');
处理了1行。
SQLWKS>select*fromteacher
2>
TNAMEPOSSAL
--------------------------------------------------
王鸿军教授6000
力宏讲师4000
于丹教授6000
潘数教授800
已选择4行。
小于1000
SQLWKS>updateteachersetsal='800'wheretname='潘数';
处理了1行。
SQLWKS>select*fromteacher
2>
TNAMEPOSSAL
--------------------------------------------------
王鸿军教授6000
力宏讲师4000
于丹教授6000
潘数教授1000
已选择4行。
插入操作:
SQLWKS>insertintoteachervalues('周星','教授','8000');
处理了1行。
SQLWKS>insertintoteachervalues('马跃','教授','900');
处理了1行。
SQLWKS>select*fromteacher
2>
TNAMEPOSSAL
--------------------------------------------------
王鸿军教授6000
力宏讲师4000
于丹教授6000
潘数教授1000
周星教授8000
马跃教授1000
已选择6行。
四、过程分析和建议
数据库中触发器的作用,规则和限制:
触发器——看到这个名字总是会想到数电中学过的触发器,有输入端和输出端,根据电平的高低来触发。
数据库中的触发器是个特殊的存储过程,主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名称而被直接调用。
作用:
使用T——SQL语句进行复杂的逻辑处理,基于一个表创建,但是可以对多个表进行操作,因此常常用于复杂的业务规则。
可以完成如下功能:
1、级联修改数据库中相关的表
2、执行比核查约束更为复杂的约束操作
3、拒绝或回滚违反引用完整性的操作。
4、比较表修改前后数据之间的差别,并根据差别采取相应的操作。
创建触发器的规则和限制:
1、CreateTrigger语句必须是批处理中的第一个语句。
2、在默认情况下,创建触发器的权限将分配给数据表的所有者,且不能转给其他用户
3、触发器是数据库对象,其名称必须遵循标识符的命名规则。
4、虽然触发器可以引用当前数据库以外的对象,但是只能在当前数据库中创建触发器。
5、虽然不能在临时数据表上创建触发器,但是触发器可以引用临时数据表。
6、不能在系统数据表创建触发器,也不可以引用系统数据库。
7、在包含使用delete或updata操作定义中,不能定义insteadof和insteadofupdate触发器。
8、TRUNCATETABLE语句不会引发Delete触发器,因为该语句没有被记入日志。
9、Writetext语句不会引发insert或update触发器
注意:
当创建一个触发器时必须指定:
名称;在其上定义触发器的表;触发器将何时激发;激活触发器的数据修改。
感想:
通过这次试验,我收获很多,这次我真正做到独立,完全靠自己一个人完成这次实验,锻炼了独立思考的能力,并且让我更加加深了对数据库触发器的认识,有很大的进步,我会继续加油的!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 关系 完整性 实验