【oracle】触发器简单实现
目标:实现实时备份uertest表数据至usertest_temp中,两表结构一致 解决:用oracle触发器实现同步 结果: 1.建表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [sql] -- 简单的用户表 create table USERTEST ( NAME VARCHAR2 (20) not null, AGE NUMBER, ISDELETE VARCHAR2 (4) ) -- 备份表 create table USERTEST_TEMP ( NAME VARCHAR2 (20) not null, AGE NUMBER, ISDELETE VARCHAR2 (4) ) |
2、触发器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | [sql] CREATE OR REPLACE TRIGGER tr_user_temp BEFORE INSERT OR UPDATE OR DELETE ON usertest FOR EACH ROW declare BEGIN IF inserting THEN INSERT INTO usertest_temp(name,age,isdelete) VALUES ( :new.name, :new.age, :new.isdelete ); ELSIF deleting THEN DELETE usertest_temp WHERE NAME =:OLD.NAME ; ELSIF updating THEN update usertest_temp SET age =:new.age, isdelete =:new.isdelete WHERE NAME =:OLD.NAME ; END IF ; END ; |
1 2 3 4 5 6 7 8 9 10 | [sql] CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER } {INSERT | DELETE | UPDATE [OF column [, column …]]} [OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...] ON [schema.]table_name | [schema.]view_name [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}] [FOR EACH ROW ] [WHEN condition] PL/SQL_BLOCK | CALL procedure_name; |
WHEN 子句说明触发约束条件。 Condition 为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL 函数。 WHEN 子句指定的触发约束条件只能用在BEFORE 和AFTER 行触发器中,不能用在INSTEAD OF 行触发器和其它类型的触发器中。 注意以下几点: 1.触发器不接受参数。 2.一个表上最多可有12个触发器,但同时、同事、同类的触发器只能有一个且不可矛盾。
3.在一个表上的触发器越多,对在该表上的DML操作的性能影响就越大。 4. 触发器最大为32KB。若确实需要,可以先建立过程,然后在触发器中用CALL语句进行调用。 5. 在触发器的执行部分只能用DML语句(SELECT、INSERT、UPDATE、DELETE),不能使用DDL语句(CREATE、ALTER、DROP)。 6. 触发器中不能包含事务控制语句(COMMIT,ROLLBACK,SAVEPOINT)。
7.在触发器主体中调用的任何过程、函数,都不能使用事务控制语句。 8. 在触发器主体中不能申明任何Long和blob变量。新值new和旧值old也不能向表中的任何long和blob列。 9.不同类型的触发器(如DML触发器、INSTEAD OF触发器、系统触发器)的语法格式和作用有较大区别。 问题:当触发器被触发时,要使用被插入、更新或删除的记录中的列值,有时要使用操作前、 后列的值. 实现: :NEW 修饰符访问操作完成后列的值 :OLD 修饰符访问操作完成前列的值 特性 INSERT UPDATE DELETE OLD NULL 实际值 实际值 NEW 实际值 实际值 NULL
【Oracle触发器简单实现】相关文章:
★ oracle sql 去重复记录不用distinct如何实现