文档章节

PL/SQL触发器

爱潜水的小八
 爱潜水的小八
发布于 2017/02/17 11:56
字数 1155
阅读 3
收藏 0
点赞 0
评论 0

数据库创建用户时想要在本用户下使用触发器,需要给用户触发器的权限

使用DBA用户执行  GRANT CREATE TRIGGER TO user_name;

如果想在当前用户下创建其他用户的触发器需要具有CREATE ANY TRIGGER的权限

如果要创建的触发器作用在数据库上的比如对start或者shutdown事件触发,则需要具有ADMINISTER DATABASE TRIGGER系统权限。

 

触发器的创建:

 

1.标准触发器的创建

CREATE TRIGGER tirgger_name

BEFORE/AFTER DELETE[UPDATE INSERT SHUTDOWN]

ON object_name

trigger_sql_body

Create trigger 表示创建触发器,随后是触发器的名字,before和after表示触发的时机,在之后是触发的事件如delete update等,使用on关键字说明触发器的操作对象,该对象可以是表或者数据库DATABASE,最后是触发器的主体代码逻辑。

实例:

CREATE TRIGGER delete_trigger--创建名为delete_trigger的触发器

BEFORE DELETE ON emp-- 之前操作,操作表emp

FOR EACH ROW --说明触发器对操作的涉及每一行都激发触发器行为

  BEGIN  --开始

    dbms_output.put_line('触发器执行成功,正在删除');

  END;

 

2.创建基于JAVA的触发器:

创建触发器的执行部分使用java代码实现

public class  InsertTrigger

{

public static void insertDate() throws Exception

{

Connection conn = JDBCConnection.defaultConnection();

Statement stm = conn.CreateStatement();

stm.execute(" INSERT INTO table_name VALUES(ID1,ID2,'inserting') ");

stm.close();

return;

}

}

然后创建一个存储过程去包含java代码

CREATE OR REPLACE PROCEDURE record_insert_trigger() --过程创建

IS

 LANGUAGE JAVA --语言

 NAME 'InsertTrigger.insertDate()'--调用java类 类名.方法名

最后创建触发器调用

CREATE OR REPLACE TRIGGER record_insert_trigger_data

BEFORE INSERT ON emp

FOR EACH ROW

  BEGIN

    CALL record_insert_trigger();

  END;

 

触发器的分类

1.基于DML操作的触发器

  这类触发器是在当用户对一个表进行insert delete update 操作时触发行为的。

  在对表进行触发行为的时候使用for each row激发表中涉及的每行数据

 该类触发器语法:

CREATE [OR REPLACE] TRIGGER trigger_name

BEFORE/AFTER INSERT[DELETE UPDATE ]

ON table_name

FOR EACH ROW[WHEN cond]

BEGIN sql_body END;

--这里需要说下[WHEN cond] 这个是限制条件,行级条件限制,当达到每种条件是在执行触发器举例说明

When(old.name in hello world)当oldname是 hello world是执行触发条件

 

 

2.基于DDl操作的触发器,语法

CREATE [OR REPLACE] TRIGGER trigger_name

BEFORE/AFTER CREATE[DROP ALTER]--创建,删除修改

ON database_name [WHEN cond]

Sql_body;

此类触发器的典型应用,当创建修改删除数据库表的时候在之前或者之后记录该用户的操作信息,以作为用户操作日志。

 

3.基于数据库级操作的触发器

CREATE [OR REPLACE] TRIGGER trigger_name

BEFORE/AFTER START[SHUTDOWM,LOGON,LOGOFF]--数据库、日志启动关闭

ON database_name [WHEN cond]

Sql_body;

 

触发器中的新值和旧值

创建基于DML的触发器时,由于操作对象是表,所以有一个可选项即for each row

以实现对每一行都激发触发器行为,Oracle提供2个临时表来访问每行中的新值和旧值即  :new 和 :old。下面举例说明下:

先创建update触发器

CREATE OR REPLACE TRIGGER update_trigger

AFTER UPDATE ON table_name

FOR EACH ROW

  BEGIN

    dbms_output.put_line('旧值:='||:OLD.CHARS);

    dbms_output.put_line('新值:='||:NEW.CHARS);

  END;

查询table_name表,查询结果

 

 

然后执行update操作

UPDATE table_name SET chars='newvalue';

查看输出日志

 

证明触发器执行成功,在查看table_name表数据已变更。

 

审核触发器的创建

顾名思义,就是当用户操作一个重要的表时,如插入数据和更新数据,希望记录该用户的用户名和更改时间等信息,以备审核时用。创建审核触发器前,我们需要创建一个表,记录审核信息

实例:

--创建审核表

CREATE TABLE user_modify

(

user_name VARCHAR2(20),

modify_time DATE,

modify_content VARCHAR2(20)

);

--创建触发器

CREATE OR REPLACE TRIGGER user_change

BEFORE UPDATE OR INSERT ON emp

FOR EACH ROW

  BEGIN

    IF inserting THEN 

      INSERT INTO user_modify

      VALUES(USER,SYSDATE,'updating');

    END IF;

  END;

 

删除触发器的创建

该类触发器的主要作用就是当在进行删除操作的时候,把删除的记录记录到另一张备份表中。直接实例

--创建删除备份表

CREATE TABLE delete_back

(

back_id VARCHAR2(20),

back_id2 VARCHAR2(20),

back_id3 VARCHAR2(20)

);

 

--创建触发器

CREATE OR REPLACE TRIGGER delete_back

BEFORE DELETE ON emp

FOR EACH ROW

  BEGIN

    INSERT INTO delete_back VALUES(old.back_id,old.back_id2,old.back_id3);

  END;

当用户操作emp表进行删除操作,激发触发器往delete_back表插入删除的数据明细

 

触发器基本管理操作

1.重新编译触发器

 alter trigger trigger_name complie;

2.屏蔽触发器(不删除使其无效)

 alter trigger trigger_name disable;

3.删除触发器

 drop trigger trigger_name;

© 著作权归作者所有

共有 人打赏支持
爱潜水的小八
粉丝 4
博文 14
码字总数 9447
作品 0
大连
程序员
【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

《ORACLE PL/SQL编程详解》 系列文章目录导航 ——通过知识共享树立个人品牌。 本是成书的,但后来做其他事了,就无偿的贡献出来,被读者夸其目前为止最“实在、经典”的写ORACLE PL/SQL编程...

yonghu86 ⋅ 2012/07/30 ⋅ 0

每周一书《Oracle 12 c PL(SQL)程序设计终极指南》

本周为大家送出的书是《Oracle 12 c PL(SQL)程序设计终极指南》,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著。 内容简介: 《Oracle 12c PL/SQL程序设计终极指南》志在打造PL/SQL领...

zting科技 ⋅ 2017/12/11 ⋅ 0

韩顺平玩转oracle之pl/sql听课笔记 《一》

要把程序做得有灵魂 By think 1 pl/sql是什么 过程,函数,触发器是pl/sql编写的。 过程,函数,触发器是在oracle的system表空间里面。 Pl/sql是非常强大的数据库过程化语言 过程,函数可以在...

长平狐 ⋅ 2012/09/19 ⋅ 0

了解DBMS_OUTPUT包

Ask Maclean Liu Oracle>正文 了解DBMS_OUTPUT包 原创maclean_0072011-08-28 23:33:40评论(0)96人阅读 DBMS_OUTPUT程序包是我们在Oracle开发过程中常用的一个包体,使用该包我们可以从存储过...

科技小能手 ⋅ 2017/11/12 ⋅ 0

Oracle之PL/SQL学习笔记之触发器

Oracle之PL/SQL学习笔记之触发器 触发器是许多关系数据库系统都提供的一项技术。在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块。 触发器在数据库里以独立的...

残风vs逝梦 ⋅ 2014/09/10 ⋅ 0

Oracle笔记 目录索引

Oracle笔记 一、oracle的安装、sqlplus的使用 Oracle笔记 二、常用dba命令行 Oracle笔记 三、function 、selectOracle笔记 四、增删改、事务 Oracle笔记 五、创建表、约束、视图、索引、序列...

ibm_hoojo ⋅ 2011/05/03 ⋅ 0

查询Oracle正在执行和执行过的SQL语句(一) v$session 表的权限

oracle 触发器中 用 v_$session 问题讨论 在非系统用户底下建触发器时引用v$session记录类型时出现问题 错误:“表和视图不存在” 但是在 pl/sql 中是可以运行 select * from v$session 的 ...

again-Y ⋅ 2013/06/28 ⋅ 0

oracle pl/sql之触发器(trigger)

一.oracle触发器介绍 触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时...

ZIJIAN1012 ⋅ 2014/04/21 ⋅ 0

数据库完整性

数据库完整性 实体完整性 实体完整性: 列级 约束条件 表级约束条件 多个属性构成主码 表级约束条件 实体完整性检查和违约处理 检查主码值是否唯一,如果不唯一则拒绝插入或者修改 2.检查主码...

iOS_愛OS ⋅ 2017/11/20 ⋅ 0

oracle的触发器

--oracletrigger.sql 触发器是指被隐含执行的存储过程,可以用PL/SQL,java,c进行开发。 触发器由触发事件,触发条件和触发操作三部分组成。 (1)触发事件 指引起触发器被触发的SQL语句,数据...

浮云飘飘 ⋅ 2014/04/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 23分钟前 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 50分钟前 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 57分钟前 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

容器之查看minikue的environment——minikube的环境信息

执行如下命令 mjduan@mjduandeMacBook-Pro:~/Docker % minikube docker-envexport DOCKER_TLS_VERIFY="1"export DOCKER_HOST="tcp://192.168.99.100:2376"export DOCKER_CERT_PATH="/U......

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部