触发器
触发器:指定一个规则,在我们做增删改操作时,只要满足该规则自动出发无需调用。
语句级触发器:不包含有for each row的触发器。
行级触发器:包含for each row。
加for each row是为了用:old或者:new对象或者一行记录。
触发语句 |
:old |
:new |
INSERT | 所有字段都是空(null) | 将要插入的数据 |
UPDATE | 更新以前该行的值 | 更新后的值 |
DELETE | 删除以前该行的值 | 所有字段都是空(null) |
--语句级触发器
--插入一条记录,输入一条新员工入职
create or replace trigger t1 after insert on emp begin dbms_output.put_line('一个新员工入职'); end;
---触发t1
insert into emp values (7400,'jolin','manager',7499,to_date('2000/12/17','yyyy-MM-dd'),8000,8000,30); select * from emp;
--行级触发器
--不能给员工降薪
--raise application_error(-20001~-20999之间,'错误提示信息');
create or replace trigger t2 before update on emp for each row declare
begin
if :old.sal>:new.sal then
raise_application_error(-20001,'不能给员工降薪');
end if;
end;
select * from emp;
update emp set sal=7788
where empno=7400;
commit;
--触发器实现主键自增【行级触发器】
--分析:在用户做插入操作之前,拿到即将插入的数据,给该数据中的主键列赋值
CREATE SEQUENCE s_emp INCREMENT BY 1 -- 每次加几个 START WITH 1 -- 从1开始计数 NOMAXvalue -- 不设置最大值 NOCYCLE ;-- 一直累加,不循环 create or replace trigger auid before insert on emp for each row declare begin select s_emp.nextval into :new.empno from dual; end; select * from emp; --使用auid实现主键自增 insert into emp (ename) values ('a')