触发器:
与表相关联的,PLSQL程序
当执行DML,自动执行触发器
语法:
create or rep;ace trigger 触发器名
before|after
delete|insert|update[of 列名]
on 表名
for each row [when 条件]
....plsql 代码
/
示例: 当插入一个数据时,自动打印“成功”
create or replace trigger logStudent
after
insert
on Student
declare
begin
DBMS_OUTPUT.PUT_LINE('增加成功');
end;
测试:
insert into student(stuno,stuname,stuage) values(12,'zs131',52);
示例: 修改姓名触发器
create or replace trigger logupdateStudnet
after
update of stuname
on student
declare
begin
DBMS_OUTPUT.PUT_LINE('您修改了姓名');
end;
测试:
update student set stuname = 'zss' where stuno = 1;
无论修改多少行,触发器只提醒了一次 语句级触发器
语句级触发器: 作用于表,只执行一次
行级触发器: 作用与每一行,每满足一次条件,都执行一次
for each row [when 条件]
行级触发器 示例:
create or replace trigger logaddstudent
after
insert
on student
for each row --就加这了一句
declare
begin
DBMS_OUTPUT.PUT_LINE('增加成功');
end;
测试:
insert into student(stuno,stuname)select empno,ename from emp;
插入14条数据,显示14个插入成功
案例: 不能在非工作时间插入员工信息 周一到周五 9点到18点
星期几: select to_char(sysdate,'day') from dual;
时间: select to_char(sysdate,'hh24') from dual;
create or replace trigger securitystudent
before
insert
on student
begin
--校验
if to_char(sysdate,'day') in ('星期六','星期日') --周末不行,9点之前,18点之后不行
or to_number(to_char(sysdate,'hh24')) not between 9 and 18
then --禁止插入,抛个例外
raise_application_error(-20000,'禁止非工作时间插入');
end if;
end;
/
测试:
insert into student(stuno,stuname,stuage) values(33,‘zs22’,21);
使用触发器确保: 涨工资后的工资不能少于涨工资前的工资
select * from emp;create or replace trigger checksal
before update
on emp
for each row
begin
if :new.sal<:old.sal
then
raise_application_error(-20002,'涨后的工资不能小于涨前的!');
end if;
end;
/