一.什么是触发器
触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。
1.触发器的功能:
- 允许/限制对表的修改
- 强制数据一致性
- 自动生成派生列,比如自增字段
- 提供审计和日志记录
- 防止无效的事务处理
- 启用复杂的业务逻辑
二.创建触发器
1.基本语法结构
Create [or replace] trigger [模式.]触发器名
before| after insert|delete|(update of 列名)
On 表名
[for each row]
When 条件
PL/SQL块
- 触发器名:触发器对象的名称。
由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。
- 触发时间:指明触发器何时执行,该值可取:
before:表示在数据库动作之前触发器执行
after:表示在数据库动作之后出发器执行
- 触发事件:指明哪些数据库动作会触发此触发器:
insert:数据库插入会触发此触发器;
update:数据库修改会触发此触发器;
delete:数据库删除会触发此触发器。
- 表名:数据库触发器所在的表。
- for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。
举例
create trigger student_triger
before insert or delete or update of student_id
on TAN.student
for each row
begin
if inserting then
dbms_output.put_line('insert trigger is chufa le .....');
end if;
if updating then
dbms_output.put_line('update trigger is chufa le .....');
end if;
if deleting then
dbms_output.put_line('delete trigger is chufa le .....');
end if;
end;
create trigger student_triger
- 在对表student 进行insert或者delete或者对student_id进行操作前,执行定义的语句
before insert or delete or update of student_id
on TAN.student
for each row
-
如果对表进行insert 操作,就输出"'insert trigger is chufa le ....."
if inserting then
dbms_output.put_line('insert trigger is chufa le .....');
end if;
- 如果对表进行update操作,就输出"update trigger is chufa le ....."
if updating then
dbms_output.put_line('update trigger is chufa le .....');
end if;
- 如果对表进行delete操作,就输出"delete trigger is chufa le ....."
if deleting then
dbms_output.put_line('delete trigger is chufa le .....');
end if;
三.触发器的分类
1.DML触发器
DML触发器是对表进行insert,update,delete操作时激发的,上面的例子就是典型的DML触发器
2.INSTEAD OF触发器
在简单视图上往往可以执行INSERT、UPDATE和DELETE操作,但是在复杂视图上执行INSERT、 UPDATE和DELETE操作是有限的。如果视图子查询包含有集合操作符、分组函数、DISTINCT关键字或者连接查询,那么将禁止在该视图上执行 DML操作。为了在这些复杂视图上执行操作,需要建立INSTEAD-OF触发器。
INSTEAD OF 触发器的限制:
- INSTEAD OF触发器只适用于视图。
- INSTEAD OF触发器不能指定BEFORE和AFTER选项。
- 不能在具有WITH CHECK OPTION选项的视图上建立INSTEAD OF触发器。
- INSTEAD OF触发器必须包含有FOR EACH ROW选项。
create or replace trigger tr_instead_of_stu_view
instead of insert on stu_view
for each row
begin
// sql 复杂的逻辑操作
end;
3.系统事件触发器
oracle的系统事件触发器:系统事件触发器是指基于oracle系统事件(如logon和startup)所建立的触发器。通过这种触发器可以跟踪系统或数据库的变化。
首先建立LOG表
createtable triger_log_table(
username varchar2(20),
log_time date,
onoff varchar(6),
address varchar2(30));
其次建立触发器
createtrigger tr_logon
after logon ondatabase
begin
insertinto triger_log_table values (ora_login_user,sysdate,'logon',ora_client_i p_address);
end;
//当用户登录数据库后时,将有关信息写入创建的log表中
createtrigger tr_logoff
before logoff ondatabase
begin
insertinto triger_log_table values(ora_login_user,sysdate,'logoff',ora_client_ ip_address);
end;
//当用户退出数据库时,将有关信息写入创建的log表中
- 在编写系统事件触发器时,应用开发人员经常需要使用事件属性函数。常用的事件属性函数如下:
- Ora_client_ip_address: 返回客户端的ip地址
- Ora_database_name: 返回当前数据库名
- Ora_des_encrypted_password: 返回des加密后的用户口令
- Ora_dict_obj_name :返回ddl操作所对应的数据库对象名
- Ora_dict_obj_name_list(name_list out ora_name_list_t): 返回在事件中被修改的对象名列表
- Ora_dict_obj_owner: 返回ddl操作所对应的对象的所有者名
- Ora_dict_obj_owner_list(owner_list out ora_name_list_t) :返回在事件中被修改的对象的所有者列表
- Ora_dict_obj_type: 返回ddl操作所对应的数据库对象的类型
- Ora_grantee(user_list out ora_name_list_t) :返回授权事件的授权者
- Ora_instance_num :返回例程号
- Ora_is_alter_column(column_name in varchar2) :检测特定列是否被修改
- Ora_is_creating_nested_table: 检测是否正在建立嵌套表
- Ora_is_drop_column(column_name in varchar2): 检测特定列是否被删除
- Ora_is_servererror(error_number): 检测是否返回了特定oracle错误
- Ora_login_user: 返回登录用户名
- Ora_sysevent: 返回触发器的系统事件名。
分享到:
相关推荐
很详细的oracle创建触发器的例子
介绍数据库触发器的PPT。内容包括:存储过程的创建与使用;存储过程的查看、编辑和删除;触发器的创建与使用;触发器的查看、编辑、重命名和删除
oracle 创建序列 完整步骤
oracle中记录用户登录信息的触发器的例子,有具体操作过程,包括错误信息及解释,这个例子是自己为某企业的oracle安全管理的具体例子
创建Oracle触发器用于表中序列值自增长(Helloblock写作)
从Oracle8i开始,Oracle引入了特殊的触发器,这些触发器并不是和特殊的DML事件相关联的(DML事件,如,INSERT,UPDATE和DELETE)。这些系统级别的触发器包括数据库启动触发器,DDL触发器和最终用户登陆/注销触发器。...
在oracle数据库当中,如何创建触发器与创建递增字段
Oracle之创建触发器.pdf 学习资料 复习资料 教学资源
--创建触发器 CREATE OR REPLACE TRIGGER tg_test BEFORE INSERT ON test FOR EACH ROW WHEN (new.nid is null) begin select seq_test.nextval into:new.nid from dual; end; --测试 insert条语句将会自动生成...
oracle触发器的创建和跨数据库查询。oracle数据库中dblink使用,跨数据库查询和操作
从Oracle8i开始,Oracle引入了特殊的触发器,这些触发器并不是和特殊的DML事件相关联的(DML事件,如,INSERT,UPDATE和DELETE)。这些系统级别的触发器包括数据库启动触发器,DDL触发器和最终用户登陆/注销触发器。...
oracle批量生成表和触发器和序列
在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块。 触发器类型 触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是...
oracle触发器
oracle创建表,索引,表空间,触发器,schema用户,序列的Sql文
--创建触发器 CREATE OR REPLACE TRIGGER test_trigger AFTER DELETE OR INSERT OR UPDATE ON test DECLARE v_type test_log.l_type%TYPE; BEGIN IF INSERTING THEN --INSERT触发 v_type := 'INSERT'; DBMS_OUTPUT....
本实例是在oracle数据库中创建表、用户,并给用户创建相关的权限,方便后期的操作,适合对数据库理解不是太深刻的,本实例给予你指导,本实例是JDBC操作数据库的基础
oracle的登录、登出触发器(时间、来访ip、用户信息、sid等等),ddl操作记录触发器(含create、drop、alter、truncate等),都属于事后触发,不影响业务操作
OracleSQL实例-ATM自动取款机数据库创建触发器.pdf 学习资料 复习资料 教学资源
Oracle数据库创建存储过程和触发器,详细过程和错误分析