Oracle 之 触发器
触发器是特定的事件出现的时候,自动隐式执行代码块,这个过程用户无法控制,用户只能控制触发的事件,触发后的操作,触发过程是自动执行的。
定义触发器:
1、名称
2、触发时间:是在执行事件之前(before)触发,还是之后(after)触发
3、事件:insert(插入)、delete(删除)、update(更新)
4、作用目标:on table_name
5、引用的值:old(旧值)、new(新值)
6、作用域:for each row(行级)或 无此行表示语句级
7、约束条件:可选,where 约束条件,不能包含查询语句,也不能调用PL/SQL函数
8、主体语句:begin ...
示例:create or replace trigger biufer_employess_emp_id
before insert or update of emp_id on employees
referencing old as old_value new as new_value
for each row
when (new_value.emp_id =9)
begin
:new_value.age :=26;
end biufer_employess_emp_id;
当执行下面SQL语句时触发器被触发:
INSERT INTO employees(emp_id,emp_name,position,age,address)
VALUES(9,'周迅','开发工程师',NULL,'南京路99号');
触发器自动执行,不会通知用户,再次查看employees表时:
9 周迅 开发工程师 26 南京路99号
但此时触发器不会提交,触发器里也不能使用commit/rollback/DDL语句,只能由用户提交(或其他程序)
触发器类型
1、语句触发器
在表上或者某些情况下的视图上执行的特定语句或者语句组的触发器。能够与insert、delete、update或者组合上进行关联。但无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次。比如,无论update多少行,也只会调用一次update语句触发器。
示例:需要对表进行DML的用户进行安全检查,看是否具有合适的特权。
create table foo(a number);
create trigger biud_foo
before insert or update or delete on foo
begin
if user not in ('donny') then
raise_application_error(-20001,'You don"t have access to modify this table. ');
end if;
end; //即使sys,system用户也不能修改foo表
2、行触发器
是指为受到影响的各个行激活的触发器。
示例:为主键生成自增序列号
create table foo(id number,data varchar2(20));
create sequence foo_seq;
create or replace trigger bifer_foo_pk
before insert on foo
for eache row
begin
select foo_seq.nextval into :new.id from dual;
end
SQL语句
insert into foo(data) values('donny');//自动添加id值
insert into foo values(5,'chen'); //插入该行5会被替换成foo_seq.nextval生成的值
select *from foo;
3、instead of 触发器
create or replace view company_name as select emp_id,emp_name,position,age,address from scctt.employess;
update company_name set emp_name = 'tom' where emp_id = 13;
create or replace trigger update_name_company_name
instead of update on company_name
begin
update employess set emp_id := :new.emp_id,
emp_name := :new.emp_name,
where employess_id = :old.emp_id;
end;
4、系统条件触发器
系统事件:数据库启动、关闭,服务器错误
create trigger ad_startup after startup on database
begin
---do some stuff
end;
5、用户事件触发器
用户事件:用户登录、注销,create/alter/drop/analyze/audit/grant/revoke/rename/trancate/logoff
示例:记录删除对象
create table drop_object(obj_name varchar2(30),obj_type varchar2(30),dropped_on date); //日志表
create or replace trigger log_drop_trigger // 触发器
before drop on donny.schema
begin
insert into drop_object values(ora_dict_obj_name,ora_dict_type,sysdate);
end;
SQL语句:
create table drop_me(a number);
create view drop_me_view as select *from drop_me;
drop view drop_me_view;
drop table drop_me;
select *from droped_objects
禁用和启用触发器
alter trigger <trigger_name> disable;
alter trigger <trigger_name> enable;
触发器的作用
1、允许/限制对表的修改
2、自动生成派生列,比如自增字段。
3、强制数据一致性。
4、提供审计和日志记录
5、防止无效的事务处理
6、启用复杂的业务逻辑
Oracle 之 触发器的更多相关文章
- Oracle数据库——触发器的创建与应用
一.涉及内容 1.理解触发器的概念.作用和类型. 2.练习触发器的创建和使用. 二.具体操作 (实验) 1.利用触发器对在scott.emp表上执行的DML操作进行安全性检查,只有scott用户登录数 ...
- [结]Oracle trigger(触发器)摘录
1.触发器: 是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 触发器在数据库里以独立的对象存储,它与存储过程和函数不同 ...
- oracle的触发器
oracle的触发器分为语句级和行级两种类型,在视图上所创建的触发器叫做什么类型的触发器? DML触发器有三类: 1, insert触发器: 2, update触发器: 3, delete触发器: 触 ...
- oracle中触发器的讲解
触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行.即触发器是当某个事件发生时自动地隐式运行.并且,触发器不能接收参数. ...
- MYSQL和ORACLE的触发器与存储过程语法差异
整改了一番脚本,遇到了一些两种数据库之间的差异,记录一下: 触发器: 差异 MYSQL ORACLE 说明 创建语句不同 create trigger `AA` BEFORE INSERT on `B ...
- Oracle - java创建Oracle 的触发器
Oracle - java创建Oracle 的触发器 今天碰到这个问题,遇到点问题,到这来 总结一下解决的办法, 需求,为一个用户当中的表增加一个自动增长列,我还没有学Oracle 的这部分,只是简单 ...
- oracle之触发器
触发器可以看做一种"特殊"的存储过程,它定义了一些与数据库相关事件(如INSERT,UPDATE,CREATE等事件)发生时应执行的"功能代码块",常用与管理复 ...
- oracle数据库触发器(trigger)用法总结
from:http://blog.csdn.net/zhanzhib/article/details/48729417 触发器的意思就是当我们对数据库对象(一般是表或视图)进行insert.updat ...
- Oracle中用触发器实现自动记录表数据被修改的历史信息
oracle中用触发器实现自动记录表数据被修改的历史信息. 有一些比较重要的表字段每次修改需要做历史记录,以后可以查询这个表中某些字段如何被修改过.由什么改成了什么等,由谁操作,操作时间等. 实例:1 ...
- Oracle使用触发器和mysql中使用触发器的比较——学习笔记
一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志, ...
随机推荐
- D5(太长了md没写完)
动态规划 三种常见实现方法 对于一个斐波那契数列,我们想要求第n项的值,就需要一项一项的递归来求 来看代码 f[o] = 0; f[1] = 1; for (int i = 2; i <= n; ...
- 创建的项目如果没有src/main/resources文件夹,如何解决?
这是刚创建的一个maven项目,由此可以看见,项目并没有存放配置文件的src/main/resources文件夹? 解决方案: (1)选中项目,右键单击,如图所示选择:Build Path --> ...
- Java基础面试题集(二)
Java程序员面试题集(1-50) 一.Java基础部分 1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 1)抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象 ...
- Hibernate框架 初识 ORM概念
Hibernate概述 Hibernate是一个ORM(对象关系映射)映射框架,它的核心思想就是在底层对JDBC进行了一次封装. 什么是框架 IT语境中的框架,特指为解决一个开放性问题而设计的具有一定 ...
- Golang的面向对象编程【结构体、方法、继承、接口】
Golang也支持面向对象编程.但与以前学过传统的面向对象编程语言有区别.1)Golang没有类class,Go语言的结构体struct和类class有相似的特性.2)Golang中不存在继承,方法重 ...
- Ubuntu安装并使用emacs
1. sudo add-apt-repository ppa:kelleyk/emacs 2. sudo apt update sudo apt install emacs26 3.安装完成,查看em ...
- idea 如何运行maven项目
1:run→Edit configurations 2:配置tomcat,左边如果没有tomcat server的话,点击 “+”,选择tomcat server→local,在右边server选项 ...
- elasticsearch-analysis-ik windows 环境 IK 中文分词器 的 下载 和 安装
1,下载插件压缩包(本地测试建议用迅雷下,生产用的绝对不要用迅雷下),链接地址:https://github.com/medcl/elasticsearch-analysis-ik/releases/ ...
- POJ 2253 Frogger(dijkstra 最短路
POJ 2253 Frogger Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fion ...
- [BZOJ 1013] [JSOI2008]球形空间产生器
[BZOJ 1013] [JSOI2008]球形空间产生器 题面 给出一个n维球体上的n+1个点,求球心坐标 分析 设球心坐标为\((x_1,x_2,\dots x_n)\),由于一个球体上的所有点到 ...