oracle触发器
- 语句级触发器
- 行级触发器
每当一个特定的数据操作语句(insert/update/delete)在指定的表上执行时, oracle自动执行相应的触发器
/* 触发器创建语法 */create [or replace] trigger 触发器名before|after /*触发时机,在执行之前还是之后执行触发器*/insert|delete|update [of 字段[,字段,...]] /* 触发事件(of是update事件的可选项)*/on 表名[for each row [when 条件]] /* 行级触发器与语句级触发器的区别 */PL/SQL块/*删除*/drop trigger 触发器名;
- 触发时机: 触发器何时执行, 取值
- before: 表示在数据库动作之前执行触发器
- after: 表示在数据库动作之后执行触发器 - 触发事件: 指明执行哪些数据库动作时触发此触发器
- for each row:操作对表每产生一行影响, 触发器就执行一次
例
-- 创建触发器create or replace trigger user_trgafter insert on tb_testfor each rowbegin dbms_output.put_line(sysdate||\'往tb_test添加了一条数据\')end;-- 触发insert into tb_test(id,name) values(user_seq.nextval,\'admin\');
例
/* 当用户登录时, 将相关的登录信息存储到用户登录日志表中 */create table login( id number(11), username varchar2(50), iP varchar2(20), login_date date, primary key(id));/* 定义日志表的主键序列 */create sequence seq_login;/* 触发器 */create or replace trigger tr_loginafter logon on databasedeclarebegin insert into login(id, username, ip, login_date) values(seq_login.nextval, ora_login_user, ora_client_ip_address, sysdate);end login;select * from login;/* login: 系统事件, 它不能被绑定到表名视图上, on database ora_login_user: 系统变量, 获取登录用户的用户名 ora_client_ip_address: 系统变量, 用户主机的IP地址*/