1 什么是触发器
当某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。因此触发器不需要人为的去调用,也不能调用。
1.1 触发器可以分为语句级触发器和行级触发器。
语句级触发器:语句级的触发器可以在某些语句执行前或执行后被触发
行级触发器:而行级触发器则是在定义的了触发的表中的行数据改变时就会被触发一次。
2 组成
2.1.触发事件:引发触发器被触发的事件 DML语句(INSERT, UPDATE, DELETE语句对表或视图执行数据处理操作)、DDL语句(如CREATE、ALTER、DROP语句在数据库中创建、修改、删除模式对象)、数据库系统事件
(如系统启动或退出、异常错误)、用户事件(如登录或退出数据库)。
2.2.触发时间:即该触发器是在触发事件发生之前(BEFORE)还是之后(AFTER)触发
2.3.触发操作:触发器触发后要完成的事情
2.4.触发对象:包括表、视图、模式、数据库。只有在这些对象上发生了符合触发条件的触发事件,触发器才会执行触发操作。
2.5.触发条件:由WHEN子句指定一个逻辑表达式。只有当该表达式的值为TRUE时,遇到触发事件才会自动执行触发操作。
2.6.触发频率:说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器和行级(ROW)触发器。(比如delete多条数据时,行级触发器可能会执行多次,语句级触发器只会触发一次)
2一般语法
CREATE [OR REPLACE] TIGGER触发器名 触发时间 触发事件 ON表名/视图名 [FOR EACH ROW] //加上FOR EACH ROW 即为行级触发器,不加时为语句级触发器 BEGIN pl/sql语句 END
3 例子:
创建测试表
create table test_2(id NUMBER, age VARCHAR2(10),name VARCHAR2(12))
create table test_2(id NUMBER, age VARCHAR2(10))
编写触发器
create or replace TRIGGER test_trigger
AFTER INSERT on test_2
FOR each ROW
BEGIN
INSERT into TEST_1 VALUES(3,'杨san');
END;
INSERT into test_2 VALUES(4,'20','0');
如果test_2发生增加操作 则触发触发器同时往test_1增加数据
old new
NEW关键字在什么情况下使用?
------最佳解决方案--------------------
oracle默认的 用old代表老数据 new代表新数据 不过二者在使用时是有限制的
insert时 只有new 没有old
delete时 只有old 没有new
update时 二者都可用
:new --为一个引用最新的列值;
:old --为一个引用以前的列值;
这两个变量只有在使用了关键字 "FOR EACH ROW"时才存在.且update语句两个都有,而insert只有:new ,delect 只有:old;
create or replace trigger qwessddd
before update or INSERT on test_3
for each row
declare
begin
select '01' into :new.name from dual;
end;
把01赋值给一个新的name