开发中肯定会用到Oracle的触发器,本文进行详细讲解。 这里实例中用到的主要是Oracle中scott用户下的emp以及dept表,数据如下
CREATE OR REPLACE TRIGGER scott_trigger
BEFORE DDL
ON SCHEMA
BEGIN
RAISE_APPLICATION_ERROR(-20008,'禁止scott用户的所有ddl操作');
END;create sequence myseq;
CREATE OR REPLACE TRIGGER emp_trigger
BEFORE UPDATE OR DELETE OR INSERT
ON emp
BEGIN
IF to_char(sysdate,'day') IN ('星期四','星期五') THEN
RAISE_APPLICATION_ERROR(-20008,'不允许在周四周五修改emp表');
END IF;
END;
update emp set sal=800;
create table emp_new
as
select * from emp;create table emp_audit(name varchar2(10),delete_time Date);CREATE OR REPLACE TRIGGER delete_trigger
AFTER DELETE ON emp_new
FOR EACH ROW
BEGIN
INSERT INTO emp_audit values(:old.ename,sysdate);
END;delete from emp_new where empno='7499';select * from emp_audit;
create table emp_new
as
select * from emp;
CREATE OR REPLACE TRIGGER emp_trigger
BEFORE UPDATE OF sal ON emp_new
FOR EACH ROW
WHEN (new.sal<old.sal OR new.sal>1.5*old.sal)
BEGIN
RAISE_APPLICATION_ERROR(-20008,'工资只增不降,且涨幅不可大于50%');
END;
update emp_new set sal = 1.6*sal where empno='7788';
这里可以看到当改变数据时会触发触发器错误,对表中某一个字段的修改用UPDATE OF即可,另外如果new和old在PLSQL块的外部
即BEGIN外面不可以加冒号。 (3)参照完整性: Example:主要用于级联更新,如更新dept表中的deptno时,emp表的deptno也更新。 这里仍然新建2个表分别和emp表dept表的数据相同。