触发器-5
2012-03-26 09:58 java ee spring 阅读(411) 评论(0) 编辑 收藏 举报五、建立系统事件触发器
---------------------------------------------------------------
第一部分:新建触发器
---------------------------------------------------------------
--案例01:使用触发器记录用户登录信息
用以下的方式可以监控登入登出的用戶:
建如下的两张表:
create table login_log -- 登入登出信息表
(
session_id int not null, -- sessionid
login_on_time date, -- 登录时间
login_off_time date, -- 退出时间
user_in_db varchar2(30), -- 登入的db user
machine varchar2(20), -- 机器名
ip_address varchar2(20), -- ip地址
run_program varchar2(20) -- 以何程序登入
);
create table allow_user -- 网络用户表
(
ip_address varchar2(20), -- ip地址
login_user_name nvarchar2(20) -- 操作者姓名
);
创建建如下的两个触发器:
create or replace trigger login_on_info -- 登入信息的trigger
after logon on database
Begin
insert into login_log(session_id,login_on_time,login_off_time,user_in_db,machine,ip_address,run_program)
select AUDSID,sysdate,null,sys.login_user,machine,SYS_CONTEXT('USERENV','IP_ADDRESS'),program
from v$session where AUDSID = USERENV('SESSIONID'); --当前SESSION
END;
create or replace trigger login_off_info --登出信息的触发器
before logoff on database
Begin
update login_log set login_off_time = sysdate
where session_id = USERENV('SESSIONID'); --当前SESSION
exception
when others then
null;
END;
--案例02:建立启动进程和关闭的跟踪触发器
create table event_table
(
event varchar2(50),
time date
);
create or replace trigger tr_startup
after startup on database
begin
dbms_output.put_line('实例启动');
insert into event_table values (ora_sysevent, sysdate);
end;
create or replace trigger tr_shutdown
before shutdown on database
begin
dbms_output.put_line('实例关闭');
insert into event_table values (ora_sysevent, sysdate);
end;
当数据库关闭或则开启后查看信息:
select event, to_char(time, 'yyyy-mm-dd hh24:mi') from event_table;
--案例03:登录和退出的触发器
create table login_table
(
username varchar2(30),
login_time date,
logoff_time date,
IP varchar2(50)
);
create or replace trigger tr_login
after logon on database
begin
insert into login_table (username, login_time, IP)
values (ora_login_user,sysdate, ora_client_ip_address);
end;
create or replace trigger tr_logoff
before logoff on database
begin
insert into login_table(username, logoff_time, IP)
values (ora_login_user,sysdate, ora_client_ip_address);
end;
select username, to_char(login_time, 'yyyy-mm-dd hh24:mi') ,
to_char(logoff_time, 'yyyy-mm-dd hh24:mi'),IP from login_table;
--案例04:建立DDL触发器
/*
主要用来记录用户的DDL语句操作情况!
新建DDL触发器时必须使用after关键字
*/
create table event_ddl
(
event varchar2(30),
username varchar2(20),
owner varchar2(20),
objectname varchar2(20),
objecttype varchar2(20),
time date
);
create or replace trigger tr_ddl
after DDL on scott.schema
begin
insert into event_ddl values (ora_sysevent, ora_login_user, ora_dict_obj_owner,
ora_dict_obj_name, ora_dict_obj_type,sysdate);
end;
select event, username, owner, objectname, objecttype, to_char(time,'yyyy-mm-dd hh24:mi' ) from event_ddl;
-------------------------------------------------------------------------
第二部分:管理触发器
-------------------------------------------------------------------------
1.查询触发器的信息
select trigger_name, trigger_type, triggering_event, table_name from user_triggers where table_name='EMP_SAL';
TRIGGER_NAME TRIGGER_TYPE
------------------------------ ----------------
TRIGGERING_EVENT
--------------------------------------------------
TABLE_NAME
------------------------------
TR_CHECK_EMP_SAL BEFORE EACH ROW
UPDATE
EMP_SAL
2.禁止触发器
alter trigger tr_check_emp_sal disable;
3.激活触发器
alter trigger tr_check_emp_sal enable;
4.禁止或激活表的所有触发器
alter table emp_sal disable all triggers;
alter table emp_sal enable all triggers;
5.重新编译触发器
alter trigger tr_check_emp_sal compile;
6.删除触发器
drop trigger tr_check_emp_sal ;
----------------------------------------------------------------------
**********************************************************************
**********************************************************************
----------------------------------------------------------------------
--案例13:变异表的演示
--1.新建表
create table emp_tab as select * from emp;
--2.新建一个触发器
create or replace trigger emp_count
after delete on emp_tab
for each row
declare
n integer;
begin
select count(*) into n from emp_tab;
dbms_output.put_line('there are now' || n );
end;
--案例14:维护触发器
alter triger tr01 disable;
alter trigger tr01 enable;