oracle创建触发器学习记录

来源:互联网 发布:淘宝上买电动车可靠吗 编辑:程序博客网 时间:2024/06/08 15:47

前提:学生表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说明有学生选了,则不能删除

于是新问题来了,看样子要把学生选课表也复制进来???

结果成了,真想去屎,,,说明触发器创建的时候也不能穿透用户关系啊!别看平时查询加上用户名前缀就行。。。