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_protectbefore delete on empfor each rowwhen (old.hiredate < to_date(‘19810601‘,‘YYYYMMDD‘))begin RAISE_APPLICATION_ERROR(-20001,‘Can NOT delete employees hired before June 1st 1981!‘);end;
(编辑:青岛站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|