oracle数据库触发器(Oracle数据库!!!行级触发器!!!:new:old怎么用谢谢!!)
本文目录
- Oracle数据库!!!行级触发器!!!:new:old怎么用谢谢!!
- oracle建立触发器 success with compilation error
- Oracle数据库中有关触发器问题
- oracle中触发器都有几种
- Oracle数据库触发器的组成是怎样的
- oracle怎么查看看触发器的源代码
- oracle触发器的语法详解
- Oracle 中的触发器有几种
- Oracle 触发器调试及遇到相关问题解决
Oracle数据库!!!行级触发器!!!:new:old怎么用谢谢!!
CREATEORREPLACETRIGGERIUD_BBBBBEFOREinsertorupdateordeleteonEM_AAAAforeachrowdeclare--localvariablesherev_countnumber;beginIfInsertingThenselectcount(*)intov_countfromem_outlivewherefact_no=:new.fact_noandpnl_no=:new.pnl_noand((nvl(:new.if_flag,’0’)=’1’andnvl(in_date,’0’)=’0’)or(nvl(:new.if_flag,’0’)=’1’andnvl(in_date,’0’)《》’0’andin_date》=:new.date_start)or(nvl(:new.if_flag,’0’)=’0’andnvl(in_date,’0’)=’0’andout_date《=:new.date_end)or(nvl(:new.if_flag,’0’)=’0’andnvl(in_date,’0’)《》’0’andin_date》=:new.date_startandout_date《=:new.date_end));ifv_count》0thenRAISE_APPLICATION_ERROR(-20001,’此员工在日期:’||:new.date_start||’之后已经登记外宿,不可以在厂里登记住宿!’);ROLLBACK;RETURN;endif;ifnvl(:new.if_flag,’0’)=’1’thenupdateem_bedsetuse=’1’wherefact_no=:new.fact_noandbuild_no=:new.build_noandfloor_no=:new.floor_noandroom_no=:new.room_noandbed_no=:new.bed_no;elsifnvl(:new.if_flag,’0’)=’0’thenupdateem_bedsetuse=’0’wherefact_no=:new.fact_noandbuild_no=:new.build_noandfloor_no=:new.floor_noandroom_no=:new.room_noandbed_no=:new.bed_no;endif;endif;ifUpdatingthenselectcount(*)intov_countfromem_outlivewherefact_no=:new.fact_noandpnl_no=:new.pnl_noand((nvl(:new.if_flag,’0’)=’1’andnvl(in_date,’0’)=’0’)or(nvl(:new.if_flag,’0’)=’1’andnvl(in_date,’0’)《》’0’andin_date》=:new.date_start)or(nvl(:new.if_flag,’0’)=’0’andnvl(in_date,’0’)=’0’andout_date《=:new.date_end)or(nvl(:new.if_flag,’0’)=’0’andnvl(in_date,’0’)《》’0’andin_date》=:new.date_startandout_date《=:new.date_end));ifv_count》0thenRAISE_APPLICATION_ERROR(-20001,’此员工在日期:’||:new.date_start||’之后已经登记外宿,不可以在厂里登记住宿!’);ROLLBACK;RETURN;endif;ifnvl(:new.if_flag,’0’)=’1’andnvl(:old.if_flag,’0’)=’0’thenupdateem_bedsetuse=’1’wherefact_no=:new.fact_noandbuild_no=:new.build_noandfloor_no=:new.floor_noandroom_no=:new.room_noandbed_no=:new.bed_no;elsifnvl(:new.if_flag,’0’)=’0’andnvl(:old.if_flag,’0’)=’1’thenupdateem_bedsetuse=’0’wherefact_no=:new.fact_noandbuild_no=:new.build_noandfloor_no=:new.floor_noandroom_no=:new.room_noandbed_no=:new.bed_no;endif;endif;ifDeletingthenifnvl(:old.if_flag,’0’)=’1’thenupdateem_bedsetuse=’0’wherefact_no=:old.fact_noandbuild_no=:old.build_noandfloor_no=:old.floor_noandroom_no=:old.room_noandbed_no=:old.bed_no;endif;endif;endIUD_EM_BEDPNL;
oracle建立触发器 success with compilation error
1、oracle数据库中的触发器,insert into users values(’05’,’trigger’,’普通’,’trigger’,’拥有一般权限’);。
2、oracle数据库中的触发器(触发器dml删除三条记录后)delete from users where u_type=’其他’;。
3、oracle数据库中的触发器(替代触发器修改记录信息)。
4、oracle数据库中的触发器(触发器dml插入一条记录,日志之前)。
5、oracle数据库中的触发器delete orders where o_id=’200708021850’;。
6、oracle数据库中的触发器(触发器dml更新一条记录之前)。
Oracle数据库中有关触发器问题
触发器是一种特殊类型的存储过程 它不同于存储过程 触发器主要是通过事件进行触发而被执行的 触发器的触发事件分可为 类 分别是DML事件 DDL事件和数据库事件 而存储过程可以通过存储过程名字而被直接调用 当对某一表进行诸如UPDATE INSERT DELETE 这些操作时 SQL Server 就会自动执行触发器所定义的SQL 语句 从而确保对数据的处理必须符合由这些SQL 语句所定义的规则
触发器是特定事件出现的时候 自动执行的代码块 类似于存储过程 但是用户不能直接调用他们
触发器功能
允许/限制对表的修改
自动生成派生列 比如自增字段
强制数据一致性
提供审计和日志记录
防止无效的事务处理
启用复杂的业务逻辑
触发器种类
触发器的种类可划分为 种 数据操纵语言(DML)触发器 替代(INSTEAD OF)触发器 数据定义语言(DDL)触发器 数据库事件触发器
数据操纵语言(DML)触发器 简称DML触发器 是定义在表上的触发器 创建在表上 由DML事件引发的触发器 编写DML触发器时的两点要素是 确定触发的表 即在其上定义触发器的表 确定触发的事件 DML触发器的触发事件有INSERT UPDATE和DELETE三种;替代触发器 简称INSTEAD OF触发器 创建在视图上 用来替换对视图进行的删除 插入和修改操作; 数据定义语言(DDL)触发器 简称DDL触发器 定义在模式上 触发事件是数据对象的创建和修改;数据库事件触发器 定义在整个数据库或模式上 触发事件是数据库事件
ORACLE产生数据库触发器的语法为
CREATE TRIGGER 触发器名
{BEFORE|AFTER|INSTEAD OF} 触发事件
ON 表名
WHEN 触发条件
DECLARE
声明部分
BEGIN
主体部分
END;
其中
触发器名 触发器对象的名称 由于触发器是数据库自动执行的 因此该名称只是一个名称 没有实质的用途 一个触发器可由多个不同的数据操纵语言操作触发 在触发器中 可用INSERTING DELETING UPDATING谓词来区别不同的数据操纵语言操作 这些谓词可以在IF分支条件语句中作为判断条件来使用
触发时间 指明触发器何时执行 该值可取 触发的时间有BEFORE和AFTER两种 分别表示触发动作发生在DML语句执行之前和语句执行之后 确定触发级别 有语句级触发器和行级触发器两种 语句级触发器表示SQL语句只触发一次触发器 行级触发器表示SQL语句影响的每一行都要触发一次
Before 表示在数据库动作之前触发器执行;在SQL语句的执行过程中 如果存在行级BEFORE触发器 则SQL语句在对每一行操作之前 都要先执行一次行级BEFORE触发器 然后才对行进行操作 如果存在行级AFTER触发器 则SQL语句在对每一行操作之后 都要再执行一次行级AFTER触发器
after 表示在数据库动作之后出发器执行 如果存在语句级AFTER触发器 则在SQL语句执行完毕后 要最后执行一次语句级AFTER触发器
触发事件 指明哪些数据库动作会触发此触发器 指INSERT DELETE或UPDATE事件 事件可以并行出现 中间用OR连接;
insert 数据库插入会触发此触发器;
update 数据库修改会触发此触发器;
delete 数据库删除会触发此触发器
表 名 数据库触发器所在的表
for each row 表示触发器为行级触发器 省略则为语句级触发器 对表的每一行触发器执行一次
触发器的创建者或具有DROP ANY TIRGGER系统权限的人才能删除触发器 删除触发器的语法如下
DROP TIRGGER 触发器名
可以通过命令设置触发器的可用状态 使其暂时关闭或重新打开 即当触发器暂时不用时 可以将其置成无效状态 在使用时重新打开 该命令语法如下
ALTER TRIGGER 触发器名 {DISABLE|ENABLE}
其中 DISABLE表示使触发器失效 ENABLE表示使触发器生效
同存储过程类似 触发器可以用SHOW ERRORS 检查编译错误
如果有多个触发器被定义成为相同时间 相同事件触发 且最后定义的触发器是有效的 则最后定义的触发器被触发 其他触发器不执行 触发器体内禁止使用MIT ROLLBACK SAVEPOINT语句 也禁止直接或间接地调用含有上述语句的存储过程 定义一个触发器时要考虑上述多种情况 并根据具体的需要来决定触发器的种类
触发器的作用
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性 除此之外 触发器还有其它许多不同的功能
( ) 强化约束(Enforce restriction)
触发器能够实现比CHECK 语句更为复杂的约束
( ) 跟踪变化Auditing changes
触发器可以侦测数据库内的操作 从而不允许数据库中未经许可的指定更新和变化
( ) 级联运行(Cascaded operation)
触发器可以侦测数据库内的操作 并自动地级联影响整个数据库的各项内容 例如 某个表上的触发器中包含有对另外一个表的数据操作(如删除 更新 插入)而该操作又导致该表上触发器被触发
( ) 存储过程的调用(Stored procedure invocation)
为了响应数据库更新触 发器可以调用一个或多个存储过程 甚至可以通过外部过程的调用而在DBMS( 数据库管理系统)本身之外进行操作
由此可见 触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题 例如 触发器能够找出某一表在数据修改前后状态发生的差异 并根据这种差异执行一定的处理 此外一个表的同一类型(INSERT UPDATE DELETE)的多个触发器能够对同一种数据操作采取多种不同的处理
总体而言 触发器性能通常比较低
lishixinzhi/Article/program/Oracle/201311/18340
oracle中触发器都有几种
oracle中触发器有三种1.DML触发器 ORACLE可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。2 .替代触发器 由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发器。它就是ORACLE 8专门为进行视图操作的一种处理方法。3. 系统触发器 ORACLE 8i 提供了第三种类型的触发器叫系统触发器。它可以在ORACLE数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等。
Oracle数据库触发器的组成是怎样的
Oracle触发器用法实例详解
本文实例讲述了Oracle触发器用法。分享给大家供大家参考,具体如下:
一、触发器简介
触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。
因此触发器不需要人为的去调用,也不能调用。
然后,触发器的触发条件其实在你定义的时候就已经设定好了。
这里面需要说明一下,触发器可以分为语句级触发器和行级触发器。
详细的介绍可以参考网上的资料,简单的说就是语句级的触发器可以在某些语句执行前或执行后被触发。而行级触发器则是在定义的了触发的表中的行数据改变时就会被触发一次。
具体举例:
1、 在一个表中定义的语句级的触发器,当这个表被删除时,程序就会自动执行触发器里面定义的操作过程。这个就是删除表的操作就是触发器执行的条件了。2、 在一个表中定义了行级的触发器,那当这个表中一行数据发生变化的时候,比如删除了一行记录,那触发器也会被自动执行了。
二、触发器语法
触发器的语法:
create begin pl/sql语句end其中:
触发器名:触发器对象的名称。由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。触发时间:指明触发器何时执行,该值可取:before:表示在数据库动作之前触发器执行;after:表示在数据库动作之后触发器执行。触发事件:指明哪些数据库动作会触发此触发器:insert:数据库插入会触发此触发器;update:数据库修改会触发此触发器;delete:数据库删除会触发此触发器。表 名:数据库触发器所在的表。for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。
触发器能实现如下功能:
功能:
1、 允许/限制对表的修改2、 自动生成派生列,比如自增字段3、 强制数据一致性4、 提供审计和日志记录5、 防止无效的事务处理6、 启用复杂的业务逻辑
来源:网页链接
oracle怎么查看看触发器的源代码
select * from user_objects where object_name = trigger_name and status=’INVALID’
甲骨文股份有限公司(NASDAQ:ORCL,Oracle)是全球大型数据库软件公司。总部位于美国加州红木城的红木岸(Redwood Shores),现时首席执行官为公司创办人劳伦斯·埃里森(Lawrence J. Ellison)。
触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。
触发器可以查询其他表,而且可以包含复杂的SQL语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。
触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。
触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。
oracle触发器的语法详解
触发器是一种特殊的存储过程 下面是触发器的详细说明
ORACLE 触发器
ORACLE产生数据库触发器的语法为
create trigger 触发器名 触发时间 触发事件
on 表名
pl/sql 语句
其中
触发器名 触发器对象的名称 由于触发器是数据库自动执行 的 因此该名称只是一个名称 没有实质的用途
触发时间 指明触发器何时执行 该值可取
before 表示在数据库动作之前触发器执行
after 表示在数据库动作之后出发器执行
触发事件 指明哪些数据库动作会触发此触发器
insert 数据库插入会触发此触发器
update 数据库修改会触发此触发器
delete 数据库删除会触发此触发器
表 名 数据库触发器所在的表
for each row 对表的每一行触发器执行一次 如果没有这一选项 则只对整个表执行一次
举例 下面的触发器在更新表auths之前触发 目的是不允许在周末修改表
create trigger auth_secure
before insert or update or delete file://对整表更新前触发
on auths
begin
if(to_char(sysdate DY )= SUN
RAISE_APPLICATION_ERROR( 不能在周末修改表auths );
( RAISE_APPLICATION_ERROR是函数 括弧内的 第一参数范围在 ~ 之间 第二个
参数是字符串 大小在 k 超过的话 系统自动截断)
end if;
lishixinzhi/Article/program/Oracle/201311/17609
Oracle 中的触发器有几种
ORACLE数据库有四种触发器,分别是DML、Instead-of、DDL、DB触发器,一般的应用系统中都是用到DML、Instead-of触发器,DDL、DB两种触发器是DBA管理数据库用得比较多四种触发器分别有不同的作用一、DML触发器:当发出UPDATE、INSERT、DELETE命令就可以触发已定义好的DML触发器,是最简单和常用的一种触发器语法:create or replace trigger trigger_nameafter|before insert|update|deleteon table_namefor each row二、Instead-of触发器:当向一个由多个表联接成的视图作DML操作时,一般情况下是不允许的,这时候就可以用Instead-of触发器来解决这种问题(在触发器写代码分别对各表作相应DML操作),语法是这样的:create or replace trigger trigger_nameinstead of insert|update|deleteon view_namefor each row三、DDL触发器:当发出CREATE、ALTER、DROP、TRUNCATE命令时会触发已定义好的DDL触发器,这种触发器可以用来监控某个用户或整个数据库的所有对象的结构变化语法:create or replace trigger trigger_namebefore|after create|alter|drop|truncateon schema|database例:--禁止用CREATE、ALTER、DROP、TRUNCATE命令操作APPS用户的对象create or replace trigger apps_no_ddlbefore create or alter or drop or truncateon appsbeginraise_application_error(-20001,’不允许用DDL操作APPS用户的对象’);end;四、DB事件触发器:当STARTUP、SHUTDOWN、LOGON、LOGOFF数据库时就会触发DB事件触发器,这种触发器可以用来监控数据库什么时候关闭/打,或者用户的LOGON/LOGOFF数据库情况语法:create or replace trigger trigger_namebefore|after startup|shutdown|logon|logoffon database例:--记录数据库关闭的时间(shutdown类型要用关键字before,startup用after)create or replace trigger db_shutdownbefore shutdownon databasebegininsert into test_tbl(log_event) values(’db shutdown at ’||to_char(sysdate,’yyyy-mm-dd hh34:mi:ss’));commit;end;--记录用户LOGON时间(logoff类型要用关键字before,logon用after)create or replace trigger user_logon_dbafter logonon databasebegininsert into test_tbl(username,logon_time) values(user,to_char(sysdate,’yyyy-mm-dd hh34:mi:ss’));commit;end;注意:要创建DDL和DB事件这两种触发器必须要有DBA的权限才行
Oracle 触发器调试及遇到相关问题解决
今天在项目中遇到一个比较棘手的问题,需要用到触发器。在编写触发器和调试过程中遇到下列问题,在此记录一下: ***隐藏网址*** 1,选中要调试的触发器,右击,然后勾选 Add debug information,只有勾选这个按钮后,调试才能进入到断点。2,选中触发器,点击 Edit,到Edit 界面,在要调试的行号前面单击,或者右键,添加断点。3,在菜单的新建中选择“测试窗口”,打开一个如下块,在begin和end中间添加能触发触发器的语句 4,按F9或者点击调试菜单中的开始菜单,进入运行调试状态(后面的红框是单步进入)5,点击运行图标跳到触发器中断点位置6,鼠标放到变量上可以显示变量值。7,如果有异常,就弹出相关异常信息。 调试的时候发现new对象的日期格式为中文,而后面又需要yyyy-mm-dd 的格式来作为查询条件。所以就在赋值的时候转换一下。在select into 给变量赋值的时候,select 查询出来的集合为空,导致报错ORA-01403,解决方案就是将这一段用begin end 包裹起来,抛出改异常的时候给变量一个默认值。如下图:
更多文章:
lol男爵头像(LOL圣诞男爵2017头像怎么得 圣诞男爵2017图标获取攻略)
2024年3月26日 00:10
免费单机游戏下载大全中文版下载(侠盗猎车手罪恶都市下载地址)
2024年5月9日 09:20
洛克王国王者空间(洛克王国王者空间什么时候结束,到2月20号还有吗)
2023年8月17日 19:40
用友u8软件(用友软件U8“将各类资产的卡片样式修改为含税卡片样式”怎样操作)
2024年5月17日 23:48
系统清理大师下载(手机系统清理大师如何卸载是恶意扣费软件吗)
2024年7月23日 01:55
微软官方网站下载中心(微软官网下载中心在哪网站哪个信誉比较好啊)
2024年6月9日 03:23
梦幻西游2官方网站(梦幻西游怎么刷五千点成就 五千点成就攻略)
2024年3月16日 15:50