oracle触发器
简介
触发器是存储的程序,在发生某些事件时会自动执行或触发。 一般情况发生下面列表的情况而执行
- DML(增删改)
- DDL
- DB OP,logon logoff,startup ,shutdown
触发器的好处
- 自动完成某些工作
- 安全
- 防止一些无效操作
- etc
创建触发器
CREATE [OR REPLACE ] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF }
{INSERT [OR] | UPDATE [OR] | DELETE}
[OF col_name]
ON table_name
[REFERENCING OLD AS o NEW AS n]
[FOR EACH ROW]
WHEN (condition)
DECLARE
Declaration-statements
BEGIN
Executable-statements
EXCEPTION
Exception-handling-statements
END;
- CREATE [OR REPLACE] TRIGGER TRIGGER_NAME -创建或与替换现有触发TRIGGER_NAME。
- {BEFORE | 之后| INSTEAD OF} - 指定何时执行触发器。INSTEAD OF子句用于在视图上创建触发器。
- {INSERT [OR] | 更新[或] | DELETE} - 这指定了DML操作。
- [OF col_name] - 指定要更新的列名。
- [ON table_name] - 指定与触发器关联的表的名称。
- [引用旧的as n n] - 这允许您为各种DML语句引用新值和旧值,例如INSERT,UPDATE和DELETE。
- [FOR EACH ROW] - 指定行级触发器,即将对受影响的每一行执行触发器。否则,触发器将在执行SQL语句时执行一次,这称为表级触发器。
- WHEN(条件) - 这为触发器将触发的行提供条件。该子句仅对行级触发器有效。
eg
create or replace trigger show_changes
before delete or insert or update on emps
for each row
when(NEW.empno > 0)
declare
sal_diff number;
begin
sal_diff := :NEW.sal - :OLD.sal;
dbms_output.put_line(\'old sal:\' || :OLD.sal);
dbms_output.put_line(\'new sal:\' || :NEW.sal);
dbms_output.put_line(\'diff sal:\' || sal_diff);
end;
效果如下: