DDL-数据定义语句:
四、触发器
-- 触发器(trigger),与某些特定的操作绑定,当达到触发条件后会自动触发
--主要用来将某些操作的过程记录下来,或者阻止某些非法的操作,保护数据
/*
触发条件:
触发时间 —— before/after
触发操作 —— insert/update/delete
触发对象 —— 表和列
触发范围 —— 所有数据或者指定条件
*/
/*
create [or replace] trigger 触发器名称
before / after
insert or update or delete
[ of 列 ] on 表
[for each row
when ( 限定条件 )]
begin
操作语句;
end;
for each row 表示每行符合条件的数据都触发
有了for each row可以不写when,有了 when 必须写for each row
when 后面的限定条件必须使用 old 或 new 来指明是以修改前的或者修改后的数据作为条件
*/
1.如果对emp表中30号部门员工的职位进行修改,
则将员工的姓名、原职位、新职位和修改时间记录下来。
--先创建一张表用来记录相关的数据
CREATE TABLE change_job
(
ename VARCHAR2(20),
old_job VARCHAR2(20),
new_job VARCHAR2(20),
ch_time DATE);
SELECT * FROM change_job;
--分析触发条件
--触发时间:before
--触发操作:update
--触发对象:emp表job列
--触发范围:30号部门
CREATE TRIGGER tri1
BEFORE
UPDATE
OF job ON emp
FOR EACH ROW
WHEN (old.deptno = 30)
BEGIN
INSERT INTO change_job
VALUES (:old.ename,:old.job,:new.job,SYSDATE);
--begin部分如果要调用表中的数据,使用:old 和 :new 限定
END;
UPDATE emp
SET job = 'SALESMAN'
WHERE deptno = 30;
SELECT * FROM emp;
2.不允许在周末对emp表中的数据进行更改
--触发条件
--触发时间:before
--触发操作:update,delete,insert
--触发对象:emp表
--触发范围:所有数据
--如果触发条件是表中的数据在when中去设置条件
--如果触发条件是客观条件,与表中的数据无关,在begin部分使用条件判断语句 if 来实现
--触发器中要阻止某些操作可以使用raise_application_error 方法来提交一个系统错误
--raise_application_error( 错误id ,错误提示)
--错误id范围是 -20001~ -29999 之间,以免跟系统错误的 id 重复,错误提示自定义字符串
CREATE TRIGGER tri2
BEFORE
INSERT OR UPDATE OR DELETE
ON emp
BEGIN
IF TO_CHAR(SYSDATE,'fmDAY') IN ('SATURDAY','SUNDAY') THEN
RAISE_APPLICATION_ERROR(-20001,'can not change data at weekend');
END IF;
END;
DELETE emp
WHERE ename = 'ALLEN';
【练习】
创建一个触发器,要求对emp表中的删除操作进行判断,不能删除1981年6月1日之前入职的员工
create trigger emp_date_protect
before
delete
on emp
for each row
when (old.hiredate < to_date('19810601','YYYYMMDD'))
begin
RAISE_APPLICATION_ERROR(-20001,'Can NOT delete employees hired before June 1st 1981!');
end;