例子:用TRIGGER记录的工资变化。 比如有一个工资表SALARY记录公司每个人的工资,想在每次修改工作时都记录到日志表SALARY_HISTORY,这当然可以用程序实现,但是如果用trigger就省去应用编程。 工资表 CREATE TABLE salary( empno int primary key, --员工ID salary int --工资 );CREATE TABLE salary_history( empno int, --员工ID modify_time date, --修改日期 salary int --修改后的工资 );生成trigger CREATE OR REPLACE TRIGGER tri_salary AFTER INSERT OR UPDATE OF salary ON salary FOR EACH ROW BEGIN insert into salary_history(empno,modify_time,salary) values(:new.empno,sysdate,:new.salary); END; / 测试 insert into salary values(1,1000); update salary set sal=2000 where empno=1; commit; select * from salary_history;
功能: 1、 允许/限制对表的修改 2、 自动生成派生列,比如自增字段 3、 强制数据一致性 4、 提供审计和日志记录 5、 防止无效的事务处理 6、 启用复杂的业务逻辑 开始 create trigger biufer_employees_department_id before insert or update of department_id on employees referencing old as old_value new as new_value for each row when (new_value.department_id<>80 ) begin :new_value.commission_pct :=0; end; / 触发器的组成部分: 1、 触发器名称 2、 触发语句 3、 触发器限制 4、 触发操作 1、 触发器名称 create trigger biufer_employees_department_id 命名习惯: biufer(before insert update for each row) employees 表名 department_id 列名 2、 触发语句 比如: 表或视图上的DML语句 DDL语句 数据库关闭或启动,startup shutdown 等等 before insert or update of department_id on employees referencing old as old_value new as new_value for each row
可以找本书看看,介绍的很详细
比如有一个工资表SALARY记录公司每个人的工资,想在每次修改工作时都记录到日志表SALARY_HISTORY,这当然可以用程序实现,但是如果用trigger就省去应用编程。
工资表
CREATE TABLE salary(
empno int primary key, --员工ID
salary int --工资
);CREATE TABLE salary_history(
empno int, --员工ID
modify_time date, --修改日期
salary int --修改后的工资
);生成trigger
CREATE OR REPLACE TRIGGER tri_salary
AFTER INSERT OR UPDATE OF salary ON salary
FOR EACH ROW
BEGIN
insert into salary_history(empno,modify_time,salary) values(:new.empno,sysdate,:new.salary);
END;
/
测试
insert into salary values(1,1000);
update salary set sal=2000 where empno=1;
commit;
select * from salary_history;
借花献佛刚好回答了一个有关触发器的例子,看看这个贴,里面有例子,还有一个场景。还有一些潜在的小知识http://topic.csdn.net/u/20090704/20/49c38a59-beaa-4fe2-8a84-b48f8042cc74.html?141
1、 允许/限制对表的修改 2、 自动生成派生列,比如自增字段 3、 强制数据一致性 4、 提供审计和日志记录 5、 防止无效的事务处理 6、 启用复杂的业务逻辑 开始
create trigger biufer_employees_department_id
before insert or update
of department_id
on employees
referencing old as old_value
new as new_value
for each row
when (new_value.department_id<>80 )
begin
:new_value.commission_pct :=0;
end;
/ 触发器的组成部分:
1、 触发器名称 2、 触发语句 3、 触发器限制 4、 触发操作 1、 触发器名称
create trigger biufer_employees_department_id 命名习惯:
biufer(before insert update for each row) employees 表名 department_id 列名 2、 触发语句
比如: 表或视图上的DML语句
DDL语句
数据库关闭或启动,startup shutdown 等等
before insert or update
of department_id
on employees
referencing old as old_value
new as new_value
for each row
说明:
1、 无论是否规定了department_id ,对employees表进行insert的时候 2、 对employees表的department_id列进行update的时候 3、 触发器限制 when (new_value.department_id<>80 ) 限制不是必须的。此例表示如果列department_id不等于80的时候,触发器就会执行。
其中的new_value是代表更新之后的值。
4、 触发操作 是触发器的主体
begin
:new_value.commission_pct :=0;
end;
主体很简单,就是将更新后的commission_pct列置为0
触发:
insert into employees(employee_id,
last_name,first_name,hire_date,job_id,email,department_id,salary,commission_pct )
values( 12345,’Chen’,’Donny’, sysdate, 12, ‘[email protected]’,60,10000,.25);
select commission_pct from employees where employee_id=12345;
触发器不会通知用户,便改变了用户的输入值。 触发器类型:
1、 语句触发器 2、 行触发器 3、 INSTEAD OF 触发器 4、 系统条件触发器 5、 用户事件触发器