oracle触发器是什么(oracle触发器的具体定义,什么时候用到!其优点是什么!)

:暂无数据 2026-08-14 04:10:01 0

oracle触发器是什么(oracle触发器的具体定义,什么时候用到!其优点是什么!)

大家好,oracle触发器是什么相信很多的网友都不是很明白,包括oracle触发器的具体定义,什么时候用到!其优点是什么!也是一样,不过没有关系,接下来就来为大家分享关于oracle触发器是什么和oracle触发器的具体定义,什么时候用到!其优点是什么!的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

本文目录

oracle触发器的具体定义,什么时候用到!其优点是什么!

触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。
触发器的优点
  触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制比用CHECK约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。

oracle触发器有什么用啊 说的全面点好么

触发器概述
触发器的概念及作用
触发器是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。当对某一表进行诸如UPDATE、 INSERT、 DELETE 这些操作时,SQL Server 就会自动执行触发器所定义的SQL 语句,从而确保对数据的处理必须符合由这些SQL 语句所定义的规则。
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能:
(1) 强化约束(Enforce restriction)
触发器能够实现比CHECK 语句更为复杂的约束。
(2) 跟踪变化Auditing changes
触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。
(3) 级联运行(Cascaded operation)。
触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。
(4) 存储过程的调用(Stored procedure invocation)。
为了响应数据库更新触,发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS( 数据库管理系统)本身之外进行操作。
由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型(INSERT、 UPDATE、 DELETE)的多个触发器能够对同一种数据操作采取多种不同的处理。
总体而言,触发器性能通常比较低。当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。

Oracle触发器的概念

触发器是在事件发生时隐式地自动运行的PL/SQL程序块,不能接收参数,不能被调用。

按照触发方式,oracle的触发器分为语句级和行级两种类型,在视图上所创建的触发器叫做什么类型的触发器

DML触发器有三类:
1, insert触发器;
2, update触发器;
3, delete触发器;
触发器的组成部分:
触发器的声明,指定触发器定时,事件,表名以类型
触发器的执行,PL/SQL块或对过程的调用
触发器的限制条件,通过where子句实现
类型:
应用程序触发器,前台开发工具提供的;
数据库触发器,定义在数据库内部由某种条件引发;分为:
DML触发器;
数据库级触发器;
替代触发器;
DML触发器组件:
1,触发器定时
2,触发器事件
3,表名
4, 触发器类型
5, When子句
6, 触发器主体
可创建触发器的对象:数据库表,数据库视图,用户模式,数据库实例
创建DML触发器:
Create 触发器名
Before| after insert|delete|(update of 列名)
On 表名
When 条件
PL/SQL块
For each row的意义是:在一次操作表的语句中,每操作成功一行就会触发一次;不写的话,表示是表级触发器,则无论操作多少行,都只触发一次;
When条件的出现说明了,在DML操作的时候也许一定会触发触发器,但是触发器不一定会做实际的工作,比如when 后的条件不为真的时候,触发器只是简单地跳过了PL/SQL块;
Insert触发器的创建:
create or replace trigger tg_insert
before insert on student
begin
dbms_output.put_line(’insert trigger is chufa le .....’);
end;
/
执行的效果:
SQL》 insert into student
2 values(202,’dongqian’,’f’);
insert trigger is chufa le .....
update表级触发器的例子:
create or replace trigger tg_updatestudent
after update on student
begin
dbms_output.put_line(’update trigger is chufale .....’);
end;
/
运行效果:
SQL》 update student set se=’f’;
update trigger is chufale .....
已更新8行;
可见,表级触发器在更新了多行的情况下,只触发了一次;
如果在after update on student后加上
For each row的话就成为行级触发器,运行效果:
SQL》 update student set se=’m’;
update trigger is chufale .....
update trigger is chufale .....
update trigger is chufale .....
update trigger is chufale .....
update trigger is chufale .....
update trigger is chufale .....
update trigger is chufale .....
update trigger is chufale .....
已更新8行;
:new 与: old:必须是针对行级触发器的,也就是说要使用这两个变量的触发器一定有for each row
这两个变量是系统自动提供的数组变量,:new用来记录新插入的值,old用来记录被删除的值;
使用insert的时候只有:new里有值;
使用delete的时候只有:old里有值;
使用update的时候:new和:old里都有值;
可以这样使用: dbms_output.put_line(’insert trigger is chufa
dbms_output.put_line(’new id is : ’||:new.stui
dbms_output.put_line(’new name is : ’||:new.st
dbms_output.put_line(’new se is : ’||:new.se);
可以这样从数据字典中查看一个表上有哪几个触发器:
SQL》 select trigger_name from user_triggers
2 where table_name=upper(’student’);
TRIGGER_NAME
------------------------------
TG_INSERT
TG_UPDATESTUDENT
带有:old变量的行级delete触发器:
create or replace trigger tg_deletestudent
before delete on student
for each row
begin
dbms_output.put_line(’old is: ’||:old.stuid);
dbms_output.put_line(’old name: ’||:old.stuname);
end;
/
运行效果:
SQL》 delete from student;
old is: 202
old name: dongqian
old is: 101
old name: liudehua
old is: 102
old name: lingqingxia
old is: 103
old name: lichanggong
old is: 104
old name: zhenxiuwen
old is: 1001
old name: lilianjie
old is: 1009
old name: tongleifuck
old is: 203
old name: kfdj
old is: 209
old name: fuck
已删除9行
When的使用:如果在begin也就是说触发器的PL/SQL主体块执行前加上when(old.se=’f’)的话,DML操作照做不误,但是只会在删除
Se=’f’的那行的时候才会执行触发器的主体动作,执行效果:
SQL》 delete from student;
old is: 209
old name: fuck
已删除9行; 这里虽然删了9行,但是只执行了一次触发器的主体,做为一个行级触发器;
混合类型触发器:
Inserting,deleting,updating三个谓词可以分别指示当前操作到底是哪个;
create or replace trigger hunhetrigger
before insert or update or delete on student
for each row
begin
if inserting then
dbms_output.put_line(’insert le.........’);
end if;
if deleting then
dbms_output.put_line(’delete le .......’);
end if;
end;
/
插入的时候就自动判断当前动作为插入:
SQL》 insert into student values(303,’me’,’f’);
insert le.........
删除的时候就自动判断当前动作为删除:
SQL》 delete from student;
delete le .......
注意,既然触发器内部的主体PL/SQL是语句,那么它同样也可以是插入删除操作而不一定只是dbms_output打印一些信息;
这正是日志表的原理:在用户执行了DML语句的时候触发主体为插入日志表以记录操作轨迹的触发器;
为什么用触发器? 当我们有两个表用来记录商品的出库入库情况,good_store用来记录库存的产品类别和数量,
而good_out用来记录出库的产品类别和数量,那么每当我们出库的某个类别的产品一定数量的时候,我们应该在good_out中插入该产品的类别和
出库数量,而同时也应该在good_store表中用update来更新库存的相应类别的产品的数量;这就交给了我们两个必须完成的任务:插入good_out
表后更新good_store表,这样的手工过程使得我们觉得非常ugly,如果只做其中一个那造成数据的不一致;所以现在我们可以用触发器,在
Good_out表的插入操作上绑定一个对good_store进行更新的触发器;当然这个过程应该是一个事务,你不必担心插入good_out表执行了,而绑定在这个动作上的触发器操作不会执行,相信Oracle设计为原子性了;
注意:触发器会使得原来的SQL语句速度变慢;
替代触发器:
创建在视图上的触发器,就是替代触发器,只能是行级触发器;
为什么要用替代触发器?
假如你有一个视图是基于多个表的字段连接查询得到的;现在如果你想直接对着这个视图insert;那你一定在想,我对视图的插入操作
怎么来反应到组成这个视图的各个表中呢?事实上,除了定义一个触发器来绑定在对视图上的插入动作上外,你没有别的办法通过系统的报错而直接向视图中插入数据;这就是我们用替代触发器的原因;替换的意思实际上是触发器的主体部分把对视图的插入操作转换成详细的对各个表的插入;
变异表:变异表就是当前SQL语句正在修改的表,所以在一个变异表上绑定的触发器不可以使用cout()函数,原因很简单:SQL语句刚刚修改了表,你怎么统计??
约束表:
维护:
Alter trigger …..disenable; 使得触发器不可用;
Alter trigger ……enable; 开启触发器;
Oracle的内置程序包
扩展数据库的功能;
为PL/SQL提供对SQL功能的访问;
一般具有sys权限的高级管理人员使用;
一个典型的程序包就是dbms_output,你老是用它的过程put_line();
Dbms_standard 提供语言工具;
Dbms_lob操作Oracle LOB;就是针对大型数据的操作设计的;
Dbms_lock用户定义的锁;
Dbms_job 允许对PL/SQL过程进行调度;
Dbms_alert 支持数据库事件的异步通知;
1,dbms_output的一些过程:
a):enable
b):disable
c):put只是把数据放到缓存(SQL-Plus的缓存,实际就是整个窗口)中,无输出功能;
d):put_line可以使得以前放在缓存中所有数据输出;并且换到下一行;
e):new_line
f):get_line
g):get_lines
2,dmbs_lob ,这个包只能是由系统管理员来操作;
Clob以字符数据存储可达2G;
Blob以二进制数据存储可达4G;
Nclob以unicode字符存储;
一个文件下载列表的例子:
创建下载目录表:
create table downfilelist
(
id varchar(20) not null primary key,
name varchar(40) not null,
filelocation bfile,
description clob
)
/
创建目录:
create or replace directory filedir as ’f:\oracle’
/只是向Oralce注册了目录,实际上并不会真的建立目录在磁盘上;Oracle无权管理和锁定操作系统的文件系统;
向目录表中插入数据:
insert into downfilelist
values(’10001’,’oracle plsal编程指南’,bfilename(upper(’filedir’),’demo.mp3’),’this is a mp3 music’)
insert into downfilelist
values(’10002’,’java 大权’, bfilename(upper(’filedir’),’x.jpg’),’good super girl’)
/在filedir的目录f:\oracle下实际存储着demo.mp3 ,x.jpg;
注意,如果你试图查询,效果是 :
sys》select * from downfilelist;
SP2-0678: 列或属性类型无法通过 SQL*Plus 显示
因为第三列是无法显示的,是一个二进制的;
下面使用dbms_lob的一些过程来进行操作:
1,read过程
declare
tempdesc clob;
ireadcount int;
istart int;
soutputdesc varchar(100);
begin
ireadcount:=5;
istart:=1;
select description into tempdesc from downfilelist where id=’10001’;
dbms_lob.read(tempdesc,ireadcount,istart,soutputdesc); 把clob类型的tempdesc中的数据读到字符类型的soutputdesc里;
dbms_output.put_line(’Top 5 character is: ’||soutputdesc);
end;
/注意,对unicode来说,汉字和字母所占的位数是一样的;
2,getlength函数
select description into tempclob from downfilelist where id=‘10001’;
ilen:=dbms_lob.GetLength(tempclob);
append,copy……..
发现这样的现象:select x into y的时候,y并不是独立于x的拷贝,因为当修改y的时候x也被修改了;
3, fileexists函数
select id ,dbms_lob.fileexists(filelocation) from downfilelist;
如果在bfile类型字段filelocation指定的系统下的目录中存在filelocation指定的系统文件,则返回int 1,否则返回0;
这说明Oracle还是可以检测到系统的文件情况的,如同java.io包里的类一样;
对bfile类型数据的操作函数有fileisopen,fileopen,fileclose等等;

Oracle触发器有几种

  • 分为三种:1 DML触发器2 替代触发器3 系统触发器

  • Oracle触发器的种类
    在Oracle中的触发器的类型主要有DML触发器、替代触发器、系统事件触发器和DDL触发器。

Oracle中触发器有几种,用法与SQL Server一样吗谢谢

ORACLE触发器有以下两类:1 语句级(Statement-level)触发器,在CREATE TRIGGER语句中不包含FOR EACH ROW子句。语句级触发器对于触发事件只能触发一次,而且不能访问受触发器影响的每一行的列值。一般用语句级触发器处理有关引起触发器触发的SQL语句的信息——例如,由谁来执行2 行级(Row-level)触发器,在CREATE TRIGGER语句中包含FOR EACH ROW子句。行级触发器可对受触发器影响的每一行触发,并且能够访问原列值和通过SQL语句处理的新列值。行级触发器的典型应用是当需要知道行的列值时,执行一条事务规则。SQL Server支持两种类型的触发器:AFTER 触发器和INSTEAD OF 触发器。其中AFTER 类型触发器要求只有执行某一操作(INSERT UPDATE DELETE) 之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对于AFTER 触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder 来完成此任务。INSTEAD OF 触发器表示并不执行其所定义的操作(INSERT、 UPDATE、 DELETE),而仅是执行触发器本身。既可在表上定义INSTEAD OF 触发器,也可以在视图上定义INSTEAD OF 触发器,但对同一操作只能定义一个INSTEAD OF 触发器。

如果你还想了解更多这方面的信息,记得收藏关注本站。

oracle触发器是什么(oracle触发器的具体定义,什么时候用到!其优点是什么!)

本文编辑:admin

本文相关文章:


花体文字转化器(帮忙把I love you forever转换成花体,,要下面这种效果~~谢谢)

花体文字转化器(帮忙把I love you forever转换成花体,,要下面这种效果~~谢谢)

今天给各位分享帮忙把I love you forever转换成花体,,要下面这种效果~~谢谢的知识,其中也会对帮忙把I love you forever转换成花体,,要下面这种效果~~谢谢进行解释,如果能碰巧解决你现在面临的问题,别忘了关注

2026年8月14日 18:30

ps人像磨皮插件(PS磨皮滤镜软件Portraiture3汉化安装教程及使用方法图解)

ps人像磨皮插件(PS磨皮滤镜软件Portraiture3汉化安装教程及使用方法图解)

本篇文章给大家谈谈ps人像磨皮插件,以及PS磨皮滤镜软件Portraiture3汉化安装教程及使用方法图解对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年8月10日 20:50

solidworks2012安装(同一台电脑怎么装两个不同的solidworks版本,比如2015和2012)

solidworks2012安装(同一台电脑怎么装两个不同的solidworks版本,比如2015和2012)

这篇文章给大家聊聊关于solidworks2012安装,以及同一台电脑怎么装两个不同的solidworks版本,比如2015和2012对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

2026年7月18日 07:10

cocos creator中文(cocoscreator和cocoscreator3d的区别)

cocos creator中文(cocoscreator和cocoscreator3d的区别)

各位老铁们好,相信很多人对cocos creator中文都不是特别的了解,因此呢,今天就来为大家分享下关于cocos creator中文以及cocoscreator和cocoscreator3d的区别的问题知识,还望可以帮助大家,解决大家的

2026年9月22日 02:30

subquery returns more than 1 row(mysql连表查询报错:Subquery returns more than 1 row)

subquery returns more than 1 row(mysql连表查询报错:Subquery returns more than 1 row)

今天给各位分享mysql连表查询报错:Subquery returns more than 1 row的知识,其中也会对mysql连表查询报错:Subquery returns more than 1 row进行解释,如果能碰巧解决你现在面

2026年9月12日 15:20

word是程序设计语言吗(word属于应用软件吗)

word是程序设计语言吗(word属于应用软件吗)

大家好,word是程序设计语言吗相信很多的网友都不是很明白,包括word属于应用软件吗也是一样,不过没有关系,接下来就来为大家分享关于word是程序设计语言吗和word属于应用软件吗的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我

2026年9月6日 20:40

or什么意思?c语言编程题,用for循环!急急急

or什么意思?c语言编程题,用for循环!急急急

今天给各位分享or什么意思的知识,其中也会对or什么意思进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年9月2日 07:10

consolidator(急求forwarder;intermodal company;consolidator;agent;carrier;freight broker的区别~~谢谢!)

consolidator(急求forwarder;intermodal company;consolidator;agent;carrier;freight broker的区别~~谢谢!)

“consolidator”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看consolidator(急求forwarder;intermodal company;consolidator;agent;carrier;frei

2026年8月29日 21:30

为什么idea里没有for(for和to都是“给”的意思,两者用法有什么区别)

为什么idea里没有for(for和to都是“给”的意思,两者用法有什么区别)

本篇文章给大家谈谈为什么idea里没有for,以及for和to都是“给”的意思,两者用法有什么区别对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年8月21日 12:00

下载appstore免费下载(在苹果appstore下载软件要钱不)

下载appstore免费下载(在苹果appstore下载软件要钱不)

本篇文章给大家谈谈下载appstore免费下载,以及在苹果appstore下载软件要钱不对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年8月9日 10:20

更多文章:


androidapp源码免费下载(如何实现APK的反编译得到APK的源码)

androidapp源码免费下载(如何实现APK的反编译得到APK的源码)

本篇文章给大家谈谈androidapp源码免费下载,以及如何实现APK的反编译得到APK的源码对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年9月22日 18:00

security的反义词(risk的反义词)

security的反义词(risk的反义词)

大家好,今天小编来为大家解答以下的问题,关于security的反义词,risk的反义词这个很多人还不知道,现在让我们一起来看看吧!

2026年9月22日 15:40

二郎神杨戬简笔画(二郎神怎么画)

二郎神杨戬简笔画(二郎神怎么画)

本篇文章给大家谈谈二郎神杨戬简笔画,以及二郎神怎么画对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年9月22日 10:50

service pack 3(操作系统版本升级(SP) Service Pack 3当中的“Service Pack 3”是什么意思)

service pack 3(操作系统版本升级(SP) Service Pack 3当中的“Service Pack 3”是什么意思)

大家好,关于service pack 3很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于操作系统版本升级(SP) Service Pack 3当中的“Service Pack 3”是什么意思的知识点,相信应该可以解决大家的一

2026年9月22日 10:20

html代码怎么写大佬教程(html网页的题来个大佬,写代码,题目在图上)

html代码怎么写大佬教程(html网页的题来个大佬,写代码,题目在图上)

本篇文章给大家谈谈html代码怎么写大佬教程,以及html网页的题来个大佬,写代码,题目在图上对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

2026年9月22日 10:10

结构体内又一个struct(c++ 在结构体中再嵌入一个结构体如何调用)

结构体内又一个struct(c++ 在结构体中再嵌入一个结构体如何调用)

本篇文章给大家谈谈结构体内又一个struct,以及c++ 在结构体中再嵌入一个结构体如何调用对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年9月22日 09:40

next是什么意思英语(next是什么单词)

next是什么意思英语(next是什么单词)

本篇文章给大家谈谈next是什么意思英语,以及next是什么单词对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

2026年9月22日 07:50

美国参议院人数(美国每个州的议员人数取决于什么)

美国参议院人数(美国每个州的议员人数取决于什么)

大家好,今天小编来为大家解答以下的问题,关于美国参议院人数,美国每个州的议员人数取决于什么这个很多人还不知道,现在让我们一起来看看吧!

2026年9月22日 05:20

高中信息技术python(高考信息技术用的是什么语言)

高中信息技术python(高考信息技术用的是什么语言)

今天给各位分享高考信息技术用的是什么语言的知识,其中也会对高考信息技术用的是什么语言进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年9月22日 02:50

cocos creator中文(cocoscreator和cocoscreator3d的区别)

cocos creator中文(cocoscreator和cocoscreator3d的区别)

各位老铁们好,相信很多人对cocos creator中文都不是特别的了解,因此呢,今天就来为大家分享下关于cocos creator中文以及cocoscreator和cocoscreator3d的区别的问题知识,还望可以帮助大家,解决大家的

2026年9月22日 02:30

最近更新

河源专注网站优化新站如何起步?
2026-09-22 18:17:45 浏览:0
敦煌seo公司到底该怎么选才靠谱?
2026-09-22 18:16:46 浏览:0
企业建站初期需要哪些必备工具?
2026-09-22 18:16:21 浏览:0
杭州做网站公司价格明细怎么算?
2026-09-22 18:15:21 浏览:0
西安网站开发公司怎么选最靠谱?
2026-09-22 18:14:52 浏览:0
热门文章

wait for you杨和苏(大家听下(wait for you)这首英文歌的开头那段音乐)
2026-06-13 16:20:04 浏览:22
刷关键字排名怎么操作最有效?
2026-09-14 20:02:13 浏览:14
oppo a9拆机教程(oppoa9拆机教程)
2026-06-13 10:40:02 浏览:12
标签列表