触发器


触发器:指定一个规则,在我们做增删改操作时,只要满足该规则自动出发无需调用。

  语句级触发器:不包含有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')