`
jeelee
  • 浏览: 636959 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

oracle学习笔记(第十一章:触发器)

阅读更多
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF}
{INSERT | DELETE | UPDATE [OF column [, column …]]}
ON {[schema.] table_name | [schema.] view_name}
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
Declare
-- 变量;
Begin
-- trigger_body;
End ;

用途﹕
--1﹐强制执行 business rule.
--2﹐更新其他 table 中的数据.
--3﹐标示数据列以供处理.
--4﹐以信号通知已发生事件
--注意事项﹕
--1﹐不能使用rollback, commit ,savepoints,transaction交易控制
--2﹐不能使用long , long raw 变量
--3,after 的方式比 before 有效率
--4,行级触发器不可对 trigger 上的本表select,insert,update,delete操作
--5,:new,:old,:parent关键词只可以用在行级触发器中[for each row]
--6,:new,:old,关键词前的冒号只能在触发器体内有效.即在触发器体外不需要冒号,例如在when子句中
--7,:new,:old,伪记录,但是定义的 rowtype 类型的变量不能接受:new,或:old,也不能将:new或:old传递到接受rowtype类型的
--8, 代码大小必须小于32KB
old修饰访问操作完成前列的值﹐new修饰访问操作完成后列的值
 利用 new 与 old 来参考数据域的值
     :OLD         :NEW
delete       被删除的值         NULL     
insert       NULL             被建立的值
update     旧值                更改后的新值
 在 begin 中使用 , 须加 :
在 when 与 referencing 不须加 :
过程或函数中
--8,触发器数据字典:user_triggers
--9,变异表(mutating table) 和约束表(constrainting table)变异表是当前被DML语句修改的表,对触发器来说变异表就是在其上定义的表.
---由于执行delete cascade引用完整性约束蚖搨n更新的表也是变异表约束表是一种需要实施引用完整性约束而读入的表.
--10,触发器中的SQL语句不能进行下列操作:
-----读或修改触发语句的任何变异表,包括触发表本身
-----读或修改触发表的约束表中的主键,外键,唯一列
--11,由于在 行级触发器中不能在触发表上使用select,update,delete,update语句,
-----但可以使用语句级触发器,但是如果要使用:new,:old关键词,就必须使用行级
-----触发器,为了既可以使用:new,:old关键词,有可以在触发表上使用select,update,
-----delete,update语句我们可以在一个表上定义两个触发器:一个行级触发器,一个
-----语句级触发器,在行家触发器中使用:new,:old关键词,在语句级中使用select,update,insert,delete语句
-----至于如何记录:new的值,我们可以使用package,并在package中使用table数据类型
--12,行级触发器和语句级触发器的触发先后顺序:语句级别前,行级级别前,行级级别后,语句级别后
--13,有 for eache row 关键词的为 行级触发器,否则是语句级触发器
--选择性启动 TRIGGER﹐使用关键词deleting,updating,inserting
--如果是因为delete而执行trigger﹐则返回true
--如果是因为update而执行trigger﹐则返回true
--如果是因为insert而执行trigger﹐则返回true

create or replace trigger empm_trigger--------------定义一个选择性的触发器
before insert or update or delete on
on empm -–变异表
for each row -–行级触发器
declare
vemp_no varchar2(10);
begin
     if deleting then
        delete from empd where emp_no=:old.emp_no;
    dbms_output.put_line('before deleting');
     elsif updating then       dbms_output.put_line('before updating');
     elsif inserting then
        dbms_output.put_line('before inserting');
    end if;
end;

例2
-- when子句在trigger中使用
-- 语法:when trigger_condition
CREATE OR REPLACE TRIGGER t_when_empm
AFTER INSERT OR UPDATE OR DELETE
ON empm
FOR EACH ROW
WHEN(NEW.age >= 60 OR old.age >= 60)  --在when子句中new前不需要加冒号
DECLARE
-- 声明变量
BEGIN
   IF inserting THEN
     INSERT INTO test VALUES(:new.emp_no,'insert',:new.age);
   ELSIF updating THEN
     INSERT INTO test VALUES(:new.emp_no,'update',:new.age); 
   ELSE
     INSERT INTO test VALUES(:old.emp_no,'delete',:old.age);
   END IF;
END;

--使触发器加强安全性:when()表示什么时间触犯
--使用when关键词﹐触发器触发前必须满足when条件
--下面的例子功能是﹕在上午11点之后向empm表插入的数据的sex列都为'1'
create or replace trigger empm_trigger5
before insert
on empm
for each row
when(to_number(to_char(sysdate,'HH24'))<11)
begin
:new.sex:='1'; --强制性的将 sex 设为 ‘1’
end;

referencing 子句在trigger中使用
-- 语法:REFERENCING [old as old_name] [new as new_name]
CREATE OR REPLACE TRIGGER t_referecing_empm
AFTER INSERT OR UPDATE OR DELETE
ON emp_m
REFERENCING NEW AS new_emp-- 在REFERENCING子句中new前不需要加冒号,该子句需要放在 for each row 之前
                          -- 使用REFERENCING子句后,可以用'引用'代替new或old
FOR EACH ROW
DECLARE

BEGIN
     IF updating OR inserting THEN
       UPDATE emp_d SET emp_email='referencing'
       WHERE emp_no = :new_emp.emp_no;
     END IF;
END;


--系统触发器
创建系统触发器的格式﹕
create or replace trigger trigger_name
{before  |  after}
{ddl_event_list  |  database_event_list}
on  {database  |  [schema_name.]schema}
[when_claus]
trigger_body
说明﹕ddl_event_list﹕表示一个或多个ddl事件﹐事件之间用or分开
      database_event_list﹕表示一个或多个数据库事件﹐事件之间用or分开
      database﹕表示是数据库级别触发器
      schema﹕表示是用户方案
      trigger_body﹕表示触发器的PL/SQL语句

--创建当一个用户USERA登录时自动记录一些信息的触发器
create table userLog
(
userLogCount number(4,0) primary key ,
userID varchar2(15) not null,
userPSW varchar2(15) not null,
loginTime date not null,--登录时间
logoutTime date not null,--下线时间
logCount number(4) not null --登录次数
);

create trigger userlogTrigger
after logon on schema
begin
insert into userLog values(1,'userA','123456','2007-6-9','2009-9-8',3);
end loguser;

--建立一个记录创建表信息的表
create table ddl_creation
(
  user_id varchar2(30),
  object_type varchar2(20),
  object_name varchar2(20),
  object_owner varchar2(20),
  creation_date date
);
--创建一个能记录创建表的相关信息的触发器
create or replace trigger create_table_info
after create on schema
begin
insert into ddl_creation(user_id,object_type,object_name,object_owner,creation_date)
values(user,sys.dictionary_obj_type,sys.dictionary_obj_name,sys.dictionary_obj_owner,sysdate);
end;


-- 建立一个记录用户登录数据库的系统triggr
create table jax_log_table
(
username varchar2(20),
log_time date,
onoff varchar(6),
address varchar2(30)
);

create trigger tr_logon
after logon on database
begin
insert into jax_log_table values(ora_login_user,sysdate,'logon',ora_client_ip_address);
end;

create trigger tr_logoff
before logoff on database
begin
insert into jax_log_table values(ora_login_user,sysdate,'logoff',ora_client_ip_address);
end;

--DDL触发器记录系统所发生的DDL事件(create,alter,drop等) 9i 以上的数据库可用
create table jax_event_ddl_table(event varchar2(20),
username varchar2(10),
                                 owner varchar2(10),
                                 objname varchar2(20),
objtype varchar2(10),
                                 time date);

create trigger tr_ddl
after ddl on database
begin
insert into jax_event_ddl_table values(ora_sysevent,ora_login_user,
ora_dict_obj_owner,ora_dict_obj_name,ora_dict_obj_type,sysdate)
end;

-- 常用系统变量
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 返回触发器的系统事件名。

--创建替代触发器 创建在视图上,只能是行级的触发器
CREATE OR REPLACE TRIGGER t_triggername
INSTEAD OF UPDATE OR INSERT OR DELETE
ON view_name
FOR EACH ROW
DECLARE
-- 声明变量;
BEGIN
     -- 代码块 ;
END ;


--更改触发器的状态﹐
--方法一﹕alter trigger﹕alter trigger trigger_name disable(enable)
--方法二﹕alter table: alter table table_name disable(enable) all triggers

分享到:
评论

相关推荐

    ORACLE经典学习笔记

    ### ORACLE经典学习笔记知识点概览 #### 第一章 ORACLE 命令 本章节主要介绍了Oracle数据库中常用的命令及其使用方法。 1. **查看参数文件**: `Desc v$parameter` - 这个命令用于查看Oracle的参数文件信息,通过...

    Oracle 10g 学习笔记

    │ ORACLE学习笔记(一) - lvhuiqing的专栏 - CSDN博客.mht.lnk │ ORACLE学习笔记(二)oracle的逻辑结构 - lvhuiqing的专栏 - CSDN博客.mht │ ORACLE学习笔记(二)oracle的逻辑结构 - lvhuiqing的专栏 - CSDN...

    ORACLE学习笔记2:日常应用、深入管理、性能优化.

    第11章 PL/SQL语言基础 第12章 存储过程和触发器 第13章 游标 第14章 任务调度 第15章 事务与锁定 第3篇 系统优化 第16章 数据库内存和进程的配置与优化 第17章 常用性能监测、分析和优化工具 第18章 对SQL...

    Oracle学习笔记.doc

    ### Oracle学习笔记知识点详解 #### 一、SQL概述与Oracle简介 - **SQL**(Structured Query Language,结构化查询语言)是一种用于管理关系型数据库的标准语言。它被用来执行各种数据库操作,如查询数据、更新数据...

    oracle学习笔记

    ### Oracle学习笔记精要 #### 第一章:Oracle概述与启动方法 - **Oracle简介**:Oracle是由美国甲骨文公司开发的一款关系型数据库管理系统,广泛应用于企业级应用环境中。 - **Oracle版本演变**: - Oracle8i:...

    最牛逼的Oracle 11g OCP学习笔记

    以下是对这份"最牛逼的Oracle 11g OCP学习笔记"中的关键知识点的详细阐述: 一、Oracle 11g基础知识 Oracle 11g引入了许多新特性,如自动内存管理、数据屏蔽、实时应用集群(RAC)、闪回数据库等。其中,自动内存管理...

    oracle学习笔记,适用初学者

    Oracle是世界上最广泛使用的数据库管理系统之一,尤其在企业级应用中占据主导地位。这款关系型数据库管理系统(RDBMS)以其...希望这本"Oracle学习笔记"能为初学者提供详尽的指导,帮助你们顺利踏入数据库管理的世界。

    Oracle 超强学习笔记

    本"Oracle超强学习笔记"将带你深入探索Oracle的世界,掌握从基础到高级的各种技术,助你在数据库管理领域提升专业技能。 1. **Oracle简介** Oracle数据库是由美国甲骨文公司开发的关系数据库系统,其核心组件包括...

    Oracle-笔记.doc

    第十八章 数据库对象:这部分可能涵盖其他数据库对象,如视图、存储过程、触发器、索引等,以及如何创建、修改和删除这些对象。 这些笔记覆盖了Oracle数据库的基础到进阶知识,对于初学者和有一定经验的DBA都是宝贵...

    oracle十八天学习笔记

    本"Oracle十八天学习笔记"涵盖了Oracle数据库的基础到高级概念,旨在帮助初学者和有一定经验的开发者深入理解Oracle的核心技术和应用。 第1天:Oracle简介与安装配置 在第一天的学习中,我们将了解Oracle的历史背景...

    Oracle数据库课堂笔记

    第十一讲:PL/SQL编程进阶 进阶PL/SQL编程涵盖游标、复合类型、包(PACKAGE)、记录类型和动态SQL等高级主题。游标用于逐行处理查询结果,复合类型允许创建自定义数据结构,包则将相关过程和变量封装在一起,提高...

    oracle_sql笔记

    Oracle SQL是数据库管理员和开发人员在Oracle数据库系统中进行数据查询和管理的重要工具。这篇笔记主要涵盖了Oracle SQL的...这两份“Oracle SQL笔记”文档应包含了上述各个方面的详细解释和实例,值得仔细阅读和学习。

    Oracle学习笔记

    以下是一些Oracle学习笔记中的关键知识点: 1. **远程访问Oracle数据库**:你可以通过URL `http://127.0.0.1:5560/isqlplus/` 来访问Oracle数据库,不论是自己的还是他人的,这表明Oracle提供了Web接口来操作数据库...

    [成功之路:ORACLE11g学习笔记].赵振平.高清文字版.rar

    《成功之路:ORACLE11g学习笔记》是由知名数据库专家赵振平编著的一本深入浅出的Oracle 11g教程。这本书主要面向希望掌握Oracle数据库技术的学习者和IT从业者,通过清晰的讲解和丰富的实例,帮助读者建立起扎实的...

    oracle 课堂笔记

    通过深入学习这些笔记,不仅可以掌握Oracle的基本操作,还能了解其高级特性,为成为一名专业的Oracle DBA或开发者打下坚实的基础。在实际工作中,结合具体的案例和实践,将理论知识转化为实践经验,是提升技能的关键...

    Java/JavaEE 学习笔记

    Oracle学习笔记...............121 前言....................................121 第一章 Selecting Rows.....................124 第二章 Limiting Selected Rows.......127 第三章 Single Row Functions.............

    oracle 学习 资料

    理解第一范式(1NF)、第二范式(2NF)和第三范式(3NF)等概念。 5. 性能优化:理解Oracle的执行计划,学会使用EXPLAIN PLAN分析SQL性能。了解索引的类型和使用场景,以及如何通过调整SQL语句或数据库参数来提升...

    Oracle培训18天老师笔记

    总的来说,这份笔记是一套全面的Oracle学习资源,无论你是初学者还是希望提升技能的专业人士,都能从中受益。通过系统的学习和实践,你将能够熟练掌握Oracle数据库的管理和开发,为你的IT职业生涯添砖加瓦。

Global site tag (gtag.js) - Google Analytics