【oracle】触发器简单实现
来源:互联网 发布:手机上录歌的软件 编辑:程序博客网 时间:2024/05/21 06:30
目标:实现实时备份uertest表数据至usertest_temp中,两表结构一致
CREATE [OR REPLACE] TRIGGER:创建或替换
BEFORE 和AFTER:触发时序分别为前触发【在执行触发事件之前触发当前所创建的触发器】和后触发方式【在执行触发事件之后触发当前所创建的触发器】
FOR EACH ROW:行触发器。
行触发器:受到影响的每个数据行,只要它们符合触发约束条件,均激活一次触发器;
语句触发器:将整个语句操作作为触发事件,当它符合约束条件时,激活一次触发器。
当省略FOR EACH ROW 选项时,BEFORE 和AFTER 触发器为语句触发器,而INSTEAD OF 触发器则只能为行触发器。
REFERENCING:说明相关名称,在行触发器的PL/SQL块和WHEN 子句中可以使用相关名称参照当前的新、旧列值,默认的相关名称分别为OLD和NEW。触发器的PL/SQL块中应用相关名称时,必须在它们之前加冒号(:),但在WHEN子句中则不能加冒号。
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 修饰符访问操作完成前列的值
特性INSERTUPDATEDELETEOLDNULL实际值实际值NEW 实际值实际值NULL
参考学习:
http://www.cnblogs.com/huyong/archive/2011/04/27/2030466.html
解决:用oracle触发器实现同步
结果:
1.建表
-- 简单的用户表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、触发器
CREATE OR REPLACE TRIGGER tr_user_temp BEFORE INSERT OR UPDATE OR DELETE ON usertest FOR EACH ROWdeclareBEGINIF inserting THENINSERT INTO usertest_temp(name,age,isdelete) VALUES(:new.name,:new.age,:new.isdelete);ELSIF deleting THENDELETE usertest_temp WHERE NAME =:OLD.NAME ;ELSIF updating THENupdate usertest_temp SET age =:new.age, isdelete =:new.isdelete WHERENAME =:OLD.NAME ;END IF ;END ;3.对USERTEST表执行增删改查操作,则usertest_temp表也会相应更改
注意:标点符号一定要是英文标点,否则会有编译错误
理解
概念:
触发器(trigger)是个特殊的存储过程,它的执行是由事件来触发自动地隐式运行[比如当对一个表进行操作( insert,delete,update)时就会激活它执行]。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-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;注释:
CREATE [OR REPLACE] TRIGGER:创建或替换
BEFORE 和AFTER:触发时序分别为前触发【在执行触发事件之前触发当前所创建的触发器】和后触发方式【在执行触发事件之后触发当前所创建的触发器】
FOR EACH ROW:行触发器。
行触发器:受到影响的每个数据行,只要它们符合触发约束条件,均激活一次触发器;
语句触发器:将整个语句操作作为触发事件,当它符合约束条件时,激活一次触发器。
当省略FOR EACH ROW 选项时,BEFORE 和AFTER 触发器为语句触发器,而INSTEAD OF 触发器则只能为行触发器。
REFERENCING:说明相关名称,在行触发器的PL/SQL块和WHEN 子句中可以使用相关名称参照当前的新、旧列值,默认的相关名称分别为OLD和NEW。触发器的PL/SQL块中应用相关名称时,必须在它们之前加冒号(:),但在WHEN子句中则不能加冒号。
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 修饰符访问操作完成前列的值
特性INSERTUPDATEDELETEOLDNULL实际值实际值NEW 实际值实际值NULL
参考学习:
http://www.cnblogs.com/huyong/archive/2011/04/27/2030466.html
http://www.jb51.net/article/18252.htm
- 【oracle】触发器简单实现
- ORACLE的简单触发器实现
- oracle简单的触发器
- oracle 触发器简单实例
- oracle简单触发器 实例
- Oracle触发器简单示例
- oracle简单触发器
- Oracle触发器简单实例
- oracle 触发器简单应用
- 一个简单的ORACLE触发器
- Oracle创建简单的触发器
- oracle触发器的简单使用
- Oracle数据库简单触发器示例
- Oracle触发器实现自动编号
- Oracle触发器的一个简单例子
- Oracle创建简单的触发器练习
- 数据库oracle--触发器的简单使用
- oracle存储过程及触发器简单案例
- Redesign Your App for iOS 7 之 页面布局
- 会说话的机器人 帮助孩子减轻在医院的痛苦
- 排序(插入,希尔,选择,堆排序,归并,快排)
- 图文详解 正向代理,反向代理,透明代理
- Qt QFileSystemModel QDirModel 示例代码, 使用方法
- 【oracle】触发器简单实现
- C++/C的文件结构和程序版式
- 水晶报表初学
- google ProtoBuf开发者指南
- hdu 1865 1sting((高精度加法+ 斐波那契数)
- 由“人人网”解析移动互联网的未来发展战略
- Uninstall WinZip Registry Optimizer with WindowsUninstaller.Org Removal Tips
- 实战 windows7 下 eclipse 远程调试 linux hadoop
- how-to-learn-machine-learning