SQL触发器

2022-07-29 09:57:49

一、触发器的语法如下

CREATE OR REPLACE TRIGGER trigger_name
<before | after | instead of>
<insert | update | delete>
ON table_name
[FOR EACH ROW]
WHEN (condition)
DECLARE
BEGIN
–触发器代码
END;
Trigger_name是触发器的名称。<before | after | instead of>可以选择before或者after或instead of。
Before表示在DML语句实施前执行触发器,而after表示在在dml语句实施之后执行触发器,instead of触发器用在对视图的更新上。
<insert | update | delete>可以选择一个或多个DML语句,如果选择多个,则用or分开,如:insert or update。
Table_name是触发器关联的表名。
[FOR EACH ROW]为可选项,如果注明了FOR EACH ROW,则说明了该触发器是一个行级的触发器,DML语句处理每条记录都会执行触发器;
否则是一个语句级的触发器,每个DML语句触发一次。
WHEN后跟的condition是触发器的响应条件,只对行级触发器有效,当操作的记录满足condition时,触发器才被执行,否则不执行。
Condition中可以通过new对象和old对象(注意区别于前面的:new和:old,在代码中引用需要加上冒号)来引用操作的记录。

二、案例一

现有如下两个表:
EMPLOYEES(EID,NAME,DEPTNO)
DEPARTMENTS(DEPTNO,DEPTNAME,TOTALNUMBER)
EMPLOYEES描述了职工编号、姓名和所在部门编号;DEPARTMENTS描述了部门编号、名称和职工总人数。
请编写触发器:每当在EMPLOYEES表中插入一行数据时,相应部门的职工总人数就加1。

CREATE TRIGGER insert_taigger after insert 
on EMPLOYEES
BEGIN
UPDATE DEPARTMENTS T 
SET T.TOTALNUMBER=T.TOTALNUMBER+1
WHERE T.DEPTNO=:NEW.DEPTNO;
END;

案例二

某数据库中有关系STUDENT(SNO,SNAME,SSEX,SAGE,SDEPT),各属性分别表示学号,姓名,性别,年龄,以及所在的系;COURSE(CNO , CNAME,CCREDIT) ,各属性分别表示课程名,学分;SC(SNO,CNO,GRADE)为学生选课表,各属性分别表示学号,课程号和分数;
完成下列的SQL语句:
定义一个AFTER的行级触发器PRINT_F,如果往成绩表SC中插入的成绩小于60就打印不及格

create trigger PRINT_F 
after insert on SCfor each row
beginifnew.grade<60)then
        dbms_output.put_line(’不及格‘);
    endif; 
 end;

案例三

在这里插入图片描述
设计1:创建触发器,在删除一个部门记录后,删除该部门下的所有员工的记录。
设计2:创建触发器,在增加一个部门记录后,在员工表中增加一条在这个部门下的员工。
设计3:创建触发器,在更新一个部门编号后,更新该部门下的所有员工的部门编号。
设计4:创建触发器,如果删除的员工的empid为1时,那么不允许删除,而其他员工可以被删除。

1、 create trigger del_dept after delete
on t_deptfor each row
begin
delete from t_emp T
where T.deptid=:old.deptid;
end;2.create trigger insert_dept after insert
on t_deptfor each row
begin
insert intot_emp(empid,empname,deptid)values(5,’jason05’,:new.deptid);
end;3.create trigger up_tigger after update
on t_deptfor each row
begin
update t_emp T set T.deptid=:new.deptid where T.deptid=:old.deptid;
end;4.create trigger del_trigger after delete
on t_empfor each row
beginif:old.deptid=1 thenraise_application_error(-20000,’不允许删除该记录’);
endif;
end;
  • 作者:onlynima
  • 原文链接:https://blog.csdn.net/onlynima/article/details/104822165
    更新时间:2022-07-29 09:57:49