代码改变世界

触发器-5

2012-03-26 09:58  java ee spring  阅读(409)  评论(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;