`
vipbooks
  • 浏览: 148967 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类

Oracle学习笔记(8) 使用PLSQL编写触发器

阅读更多
    时间过得真快啊,转眼就到了Oracle学习笔记的最后个章节了,通过前面七章的学习大家应该对Oracle编程有了一定了了解了吧,这东东如果一段时间不用很快就会忘记了,所以我会把自己学习过的东西做好详细的笔记,用到的时候可以随时查找,马上上手!希望这些笔记能对大家有些帮助!
    这是第八章的学习笔记,学习完第七章的子程序和包之后,开始要学习触发器的使用了……,希望大家能多给俺一些支持啊!
    编程时使用的工具是PLSQL Developer 7.1.4

DML 触发器:
对表执行Insert、Update、Delete操作时激发
可以用于执行校验、设置初使值、审核改变、甚至禁止某种DML操作
语法:
CREATE OR REPLACE TRIGGER 触发器名称
{AFTER|BEFORE } -- 指定触发时机
{INSERT OR DELETE OR UPDATE} -- 指定触发器事件
ON 表名  --指定所监控的表
{FOR EACH ROW|FOR EACH STATEMENT} -- 指定触发器次数
BEGIN
--代码;
END;
 
相关概念:
AFTER|BEFORE:在什么事件之前或之后执行
INSERT|DELETE|UPDATE:什么事件
ON 表名:触发器建在什么表上,即监控什么表
FOR EACH ROW:行级触发,示例:delete from t1,删除1000行,则执行1000次(一行一次)
FOR EACH STATEMENT:语句级触发,示例: delete from t1,删除1000行,则执行1次(一句一次)
:new 行变量:保存事件发生时新数据所在行,只有insert事件和update事件才有新数据
:old 行变量:保存事件发生时旧数据所在行,只有delete事件和update事件才有旧数据
 
示例:指出事件,及事件中的新数据和旧数据
insert into emp(empno,ename) values(51,'job');
分析:只有一行新数据(51,job),对应:new变量。

update emp set ename='oracle' where empno = 51;
分析:旧数据 (51,job)   ,对应:old变量。
新数据(51,oracle),对应:new变量。

delete from emp where empno = 51;
分析:只有一行旧数据(51,oracle),对应:old变量。
-- 显示触发器
select trigger_name,status from user_triggers;
-- 禁止触发器
alter trigger tr_emp_salary disable;
-- 激活触发器
alter trigger tr_emp_salary enable;
-- 禁止表的所有触发器
alter table employee disable all triggers;
-- 激活表的所有触发器
alter table employee enable all triggers;
-- 重新编译触发器
--alter table tr_emp_salary compile;
-- 删除触发器
drop trigger tr_emp_salary;

-- 语句级触发器
-- 禁止员工在休息日改变雇员信息
create or replace trigger tr_sec_emp
  -- before:在DML事件之前执行
  before insert or update or delete
  on employee
  -- 如果在这里没有指定是行级还是语句级触发器,默认就是 FOR EACH STATEMENT
begin
  if to_char(sysdate,'DAY','nls_date_language=AMERICAN')
     in('SAT','SUN') then
        case
           -- 当触发事件是Insert操作时,该条件谓词返回值为True,否则为False
           when inserting then
              raise_application_error(-20001,'不能在休息日增加雇员信息!');
           -- 当触发事件是Update操作时,该条件谓词返回值为True,否则为False
           when updating then
              raise_application_error(-20002,'不能在休息日修改雇员信息!');
           -- 当触发事件是Delete操作时,该条件谓词返回值为True,否则为False
           when deleting then
              raise_application_error(-20003,'不能在休息日删除雇员信息!');
        end case;
  end if;   
end;
/

-- 限制员工的工资不能超过当前的最高工资
create or replace trigger tr_emp_salary before
  -- update of 后面指定在那些列被改变时才调用这个触器,如果不加of 默认是所有列
  update of salary on employee
  -- 指定该触发器为行级触发器
  for each row
-- 如果要定义变量,则只能在Declare中定义
declare
  maxSalary number(10,2);
begin
  select max(salary) into maxSalary from employee;
  if :new.salary > maxSalary then
     raise_application_error(-20010,'员工工资超出工资上限!');
  end if;
end;
/

-- 设置员工的工资不能低于原工资,但也不能高出原工资的20%
create or replace trigger tr_emp_say before update of salary
  on employee for each row
  -- 设置执行触发器的条件
  when (new.salary < old.salary or new.salary > old.salary*1.2)
  begin
    raise_application_error(-20011,'员工的不能降薪,但工资升幅不能超过20%!'); 
end; 

在CMD中执行:audit insert,update,delete on employee by access;
可以设置Employee表的审计选项,如果在Employee表上执行了Insert、
Update和Delete操作,Oracle会将关于SQL操作的信息(用户、时间等)
写入数据字典中,但使用数据库审计只能审计SQL操作,而不能记载数据变化

Instead of 触发器:
它是DML触发器的替代品,控制对视图的操作,它可以使不能更新的视图变为可更新,
以及覆盖可更新的视图的行为 
注意:
Instead of 选项只适用于视图
当基于视图建立触发器时,不能指定Before和After选项
在建立视图时没有指定with check option选项
当建立Instead of触发器时,必须指定for each row选项
-- 创建用户表
-- drop table users;
create table users(
       userId int not null,
       username varchar(20) not null,
       password varchar2(50) not null,
       logintime date not null
)
-- 向用户表中插入数据
insert into users values(1,'user1',11111,sysdate);
insert into users values(2,'user2',22222,sysdate);
insert into users values(3,'user3',33333,sysdate);
insert into users values(4,'user4',44444,sysdate);
insert into users values(5,'user5',55555,sysdate);
select * from users;
-- 建立复杂视图
-- drop view emp_users;
create or replace view emp_users as
select distinct e.empno,e.name,u.username from employee e,users u where e.empno = u.userId;

select * from emp_users;
-- drop view tr_instead_of_emp_users;
create or replace trigger tr_instead_of_emp_users
instead of insert on emp_users for each row
declare
   i_temp int;
begin
   -- 同时向两张表中插入数据
   select count(*) into i_temp from employee where empno = :new.empno;
   if i_temp = 0 then
      insert into Employee values(:new.empno,:new.name,'销售经理',1,'2009-01-09',5300,'销售',4);
   end if;
   
   select count(*) into i_temp from users where userId = :new.empno;
   if  i_temp = 0 then
      insert into users values(:new.empno,:new.username,55555,sysdate);
   end if;
end;
/

-- 测试Instead of 触发器
insert into emp_users values(10,'王五','小李');
insert into emp_users values(11,'张三','小明');
select * from emp_users;

数据库事件触发器:
在数据库启动、关闭、用户登录、退出或者Oracle错误发生时,以及执行创建、删除表、索引等DDL语句时激发
主要用于跟踪数据库活动
创建打开数据库触发器:after startup
创建用户登录触发器:after logon
创建用户退出触发器:before logoff
创建DDL触发器:after ddl
-- 建立用户登录的触发器
create or replace trigger tr_logon after logon on database
   begin
   raise_application_error(-20001,ora_login_user || '用户登录数据库!');
end;
/
-- 建立用户退出的触发器
create or replace trigger tr_logoff before logoff on database
   begin
   raise_application_error(-20002,ora_login_user || '用户退出数据库!');
end;
/
-- 创建DDL日志表
create table ddl_log
(
  -- DDL事件
  ddl_event varchar2(20),
  -- 对应的数据库登录用户名
  username varchar2(10),
  -- 对应的对象的所有者名
  owner varchar2(10),
  -- 对应的数据库对象名
  objname varchar2(50),
  -- 对应的数据库对象类型
  objtype varchar2(10),
  -- 对应的数据库操作时间
  time date
)
-- 创建DDL触发器
create or replace trigger tr_ddl_log
after ddl on database
begin
      insert into ddl_log values(
      ora_sysevent,ora_login_user,ora_dict_obj_owner,
      ora_dict_obj_name,ora_dict_obj_type,sysdate
      );
end;

select * from ddl_log
-- 测试DDL触发器
create table aa(aid int)
drop table aa
分享到:
评论
1 楼 nmx253 2010-04-21  
ddddd

相关推荐

    oracle学习笔记(从入门到精通)

    压缩包主要包括15个文档,主要是本人学习oracle过程中的笔记,希望...08-PLSQL和游标结合学习笔记.txt 09-游标学习笔记.txt 10-重要的函数的学习笔记.txt 11-存储过程学习笔记.txt 12-触发器学习笔记.txt 13-pl编码.txt

    学习oracle笔记-PLSQL

    在Oracle环境中,PL/SQL(Procedural Language for SQL)是一种过程化的编程语言,主要用于编写存储过程、函数、触发器等组件,以此来增强数据库的功能性和安全性。 1. **扩展Oracle数据库的编程性能**:通过将业务...

    学习笔记_使用plsql导出数据.doc

    这种方式限制于导出当前用户拥有的表,若需导出其他用户的所有对象,推荐使用Oracle的命令行工具`exp`和`imp`。 当需要导出表结构、数据以及相关对象(如触发器、函数)时,可以选择`Tools`菜单下的`Export Tables`...

    Oracle 10g 学习笔记

    │ Oracle学习笔记.pdf │ Oracle学习笔记.wps │ 安装Oracle后myEclipse不能正常使用.txt │ 手工配置listener.ora【避免出现ORA-12514错误】.txt │ 贴子树状态存储结构.jpg │ 贴子树状态存储结构.sql │ ├─01...

    PLSQL学习笔记(1-7)

    本“PLSQL学习笔记”将逐步讲解这些概念,通过实例和练习帮助读者巩固理解,进一步提升在Oracle数据库开发中的技能。无论你是初学者还是有经验的开发者,这份笔记都能提供有价值的参考。通过深入学习和实践,你将...

    oracle plsql 菜鸟学习笔记

    Oracle PL/SQL 是一种基于 Oracle 关系数据库管理系统的过程语言,主要用于编写存储过程、函数和触发器等。下面是 Oracle PL/SQL 的基础知识点总结: 一、变量命名规则 * 变量名以字母开头,不能包含空格,最大...

    oracle笔记二--plsql 编程.txt

    **标题**: oracle笔记二--plsql 编程 **描述**: oracleoracleoracleoracleoracleoracleoracleoracle(推测为占位符文本,无实际意义) **标签**: oracle **部分内容**: 在部分内容中提到了关于Oracle 10g的安装与...

    Oracle SQL & PLSQL学习笔记

    Oracle SQL 和 PL/SQL 是两种在 Oracle 数据库管理系统中广泛使用的语言,用于管理和操作数据库。SQL,即结构化查询语言,主要分为三个类别:DML(数据操纵语言)、DDL(数据定义语言)和 DCL(数据控制语言)。 1....

    精通oracle 10g plsql 编程-学习笔记

    ### 精通Oracle 10g PL/SQL编程学习笔记 #### 一、PL/SQL综述 **1.1 PL/SQL的功能与作用** PL/SQL (Procedural Language for SQL) 是一种专门为Oracle数据库设计的过程化语言,它结合了SQL的数据处理能力与过程化...

    ORACLE_PlSql-甲骨文学习笔记

    ### ORACLE_PlSql-甲骨文学习笔记 #### 一、创建表 ##### 创建表一 ```sql CREATE TABLE TABLE_NAME ( AAA INTEGER CONSTRAINT PK_TABLE_NAME PRIMARY KEY, BBB VARCHAR2(10) NOT NULL, DOB DATE, CCC VARCHAR...

    PLSQL笔记-从hello word到触发器,包,游标高级应用

    PLSQL,全称为Procedural Language/SQL,是Oracle数据库提供的结构化查询语言扩展,它结合了SQL(Structured Query Language)...通过学习这些笔记,你将能够掌握PLSQL的高级应用,从而在Oracle数据库开发中游刃有余。

    oracle学习笔记

    Oracle学习笔记是一个面向初学者的资源集合,旨在帮助读者快速入门Oracle数据库系统。Oracle是全球广泛使用的大型关系型数据库管理系统之一,尤其在企业级应用中占据重要地位。这份笔记涵盖了Oracle的基础知识,对于...

    Oracle_10g_plsql实战笔记.doc

    ### Oracle 10g PL/SQL 实战笔记关键知识点解析 #### 一、PL/SQL 概述 - **PL/SQL** (Procedural Language for SQL) 是 Oracle 数据库的一种扩展,它允许用户在 SQL 的基础上进行更复杂的程序设计。 - **特性**: ...

    oracle经典笔记

    《Oracle经典笔记》是一份深度探讨Oracle数据库管理系统的综合学习资料。这份笔记涵盖了从Oracle PL/SQL编程到SQL查询语言的广泛主题,旨在帮助读者深入理解Oracle数据库的运作机制和应用技巧。 首先,我们来看看...

    PLSQL学习笔记

    这些只是PL/SQL学习笔记的部分内容,实际使用中还会涉及游标、子程序、异常处理、动态SQL等多个方面。掌握PL/SQL能帮助开发者更有效地管理和操作Oracle数据库,实现复杂的数据处理任务。通过不断实践和学习,你可以...

    韩顺平oracle视频笔记

    ### 韩顺平Oracle视频笔记知识点概览 #### 1. Oracle 用户管理 - **概念**:在Oracle数据库中,用户是用来管理访问权限的基本单位。每个用户都可以有自己的模式(schema),其中包含各种对象如表、视图等。 - **创建...

    Oracle9i PLSQL 入门到精通读书笔记

    通过阅读“Oracle9i PLSQL 入门到精通”这本书,读者可以系统地学习如何使用PLSQL进行数据库编程,从简单的数据操作到复杂的业务逻辑实现,逐步提升为数据库专家。书中的实例和实践项目将帮助读者巩固理论知识,提高...

    sql和plsql学习笔记

    SQL(Structured Query Language)是用于管理和操作关系数据库的标准语言,而...随着经验的积累,开发者可以深入学习高级特性和最佳实践,如性能优化、并发控制、数据库设计等,以提升在Oracle数据库环境下的开发能力。

Global site tag (gtag.js) - Google Analytics