前提:学生表S,课程表C和学生选课表SC在sys用户下,字段如下:
create table S_RZ0122 (
Sno varchar2(11) primary key,
Sname varchar2(20) not null,
Ssex varchar(2) not null ,
Sage number(2) not null,
Sdept varchar(20) not null
)
create table C_RZ0122(
Cno varchar2(20) primary key,
Cname varchar2(20) not null ,
Ccredit number(2) not null
)
create table SC_RZ0122(
Sno varchar2(11) not null,
Cno varchar2(20) not null,
Score number(3) ,
primary key(Sno ,Cno),
foreign key(Sno) references S_RZ0122(Sno),
foreign key(Cno) references C_RZ0122(Cno)
)
在JXGL数据库中创建一触发器,保证 S 表中学生的年龄在 8-45 岁之间。
触发器说明:(触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。)
首次创建出错:错误在下面,因为SYS用户所属的表中不能创建触发器,所以先复制了一份表到SYSTEM用户中,
再创建触发器
测试:
(4) 在 JXGL 数据库中创建一触发器,当有学生选了某门课时,不能从 C 表中删除
同样的,先复制C课程表
再复制学生选课表:
创建触发器:
测试:成功
实验错误分析记录:
整个实验做下来困难重重啊!因为这些平时使用的不是很多,所以用起来很生疏,特别是触发器的使用的更少,这还是从头开始学了。Oracle也挺烦的,这么麻烦。以下是遇见的部分错误与感受,重要的都记下了,方便以后查看。
3、创建触发器报错:
解决办法:再复制一份表到其他的用户下面,比如system
后来就可以了。。。
4、创建触发器2:报错不能有子查询
解决办法:统计SC学生选课表中该门课程的选课数目,如果选课数目大于0说明有学生选了,则不能删除
于是新问题来了,看样子要把学生选课表也复制进来???
结果成了,真想去屎,,,这说明触发器创建的时候也不能穿透用户关系啊!别看平时查询加上用户名前缀就行。。。