触发器-5

原创 2012年03月26日 09:58:51

五、建立系统事件触发器

---------------------------------------------------------------
第一部分:新建触发器
---------------------------------------------------------------

 

--案例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;

版权声明:日常札记,乐于分享

MySQL——触发器的创建和使用总结

什么是触发器 触发器(TRIGGER)是MySQL的数据库对象之一,从5.0.2版本开始支持。该对象与编程语言中的函数非常类似,都需要声明、执行等。但是触发器的执行不是由程序调用,也不是由手工启动,...
  • Goskalrie
  • Goskalrie
  • 2016年11月03日 13:34
  • 20092

什么是MySQL触发器

MySQL的触发器和存储过程一样,都是嵌入到MySQL的一段程序。利用MySQL触发器可以对表进行增、删、改操作同时响应另一张表做出相同的操作。下面简单介绍一下MySQL触发器的基本语法。 如何创建...
  • dongsg11200
  • dongsg11200
  • 2013年08月16日 23:33
  • 2838

Oracle触发器和MySQL触发器之间的区别

Oracle触发器格式: CREATE [OR REPLACE] TRIGGER trigger_name BEFORE|AFTER INSERT|UPDATE|DELETE ON table...
  • a19881029
  • a19881029
  • 2014年07月16日 16:31
  • 3836

MySQL5.6 触发器的使用(条件分支、变量的使用)

use fs; /*product_info表中,仪器和试剂一定是不同的产品,id上不可能重复,可以放心删*/ create trigger check_record_delete_tri...
  • zhouyingge1104
  • zhouyingge1104
  • 2014年07月07日 20:11
  • 23927

被Oracle触发器给坑了

例行检查数据库AWR报告,有一条update语句执行多次,每次执行时间30多秒,这条SQL语句很简单,就是根据主键条件修改数据,主键个数是1到100之间。这个问题由来已久,只是偶尔出现。主键是varc...
  • guogang83
  • guogang83
  • 2014年11月11日 09:02
  • 3146

浅谈触发器使用

个人重构时看有人登录时使用触发器,当时我是用存储过程+事务实现的,也没有进一步思考,表面理解触发器就是由一个事件触发另一个事件,存储过程也是封装了一组sql语句,再加上事务的一致性原则,也可以达到一个...
  • u010097777
  • u010097777
  • 2014年10月30日 11:27
  • 2122

在PLSQL工具中如何调试oracle的触发器

本文仅仅是简单的介绍如何调试触发器,小编本人也是不建议程序中使用触发器的,因为触发器的使用给维护带来了很大的很大的不便,谨以此文总结一些触发器的调试。使用到的数据库为oracle数据库,使用的数据库连...
  • u013058618
  • u013058618
  • 2016年10月30日 22:57
  • 5090

SqlServer2008--建立触发器实例

 http://www.cnblogs.com/caishuhua226/archive/2012/12/11/2813227.html SqlServer2008--建立触发器实例 ...
  • hewusheng10
  • hewusheng10
  • 2016年05月16日 09:00
  • 1010

Hibernate与数据库触发器协同工作

数据库触发器是数据库的一种监听机制,这种机制会监视数据库中的某种特定的操作,当这种操作发生时,触发器就会执行,并且会完成一些特定的逻辑,在数据库中能够激发触发器的操作有:insert,update,d...
  • gulijiang2008
  • gulijiang2008
  • 2015年10月17日 22:34
  • 1055

关于mysql触发器的介绍

1. 触发器的介绍 触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL也不需要手工启动,只要当一个预定义的事件发生的时候,就会被MYSQL自动调用。 触...
  • qq_35347459
  • qq_35347459
  • 2017年04月27日 15:39
  • 488
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:触发器-5
举报原因:
原因补充:

(最多只允许输入30个字)