PLSQL触发器详解-2
PLSQL基础(二)
PL/SQL Control Statements
IF THEN 语句 IF condition THEN statements END IF; IF THEN ELSE语句 IF condition THEN statements ELSE else_statements END IF; IF THEN ELSIF 语句 IF condition_1 THEN statements_1 ELSIF condition_2 THEN statements_2 END IF;
Collection Methods - 1
DELETE 删除集合中的所有元素 DELETE(n) 删除集合中的任意元素 n代表 着集合中的索引 DELETE(m,n) m,n代表着集合中的索引, 并且m<=n
TRIM 删除集合中的最末位的一个元素 TRIM(n) n代表着最末位的元素个数
Varrays (Variable-Size Arrays)
可变长度的数组的INDEX是从1开始起,到达该数组的元素个数 DECLARE TYPE TeamMembers IS VARRAY(4) OF VARCHAR2(15); myteam TeamMembers := TeamMembers(); BEGIN DBMS_OUTPUT.put_line(myteam.COUNT); myteam.EXTEND(3); DBMS_OUTPUT.put_line(myteam.COUNT); myteam(1) := 'Tom1'; myteam(2) := 'Tom2'; myteam(3) := 'Tom3'; FOR i IN myteam.FIRST .. ST LOOP DBMS_OUTPUT.put_line(myteam(i)); END LOOP; END;
oraclePLSQL编程语句之触发器
oraclePLSQL编程语句之触发器(本⽂章内容仅在windows10下经测试能够运⾏,不能保证其他环境下的可靠性)⽬录触发器的概念定义⼀个规则,在增删改操作时,只有满⾜规则,⾃动触发,⽆需调⽤。
触发器的分类1)语句级触发器:不包含for each row2)⾏级触发器:包含for each row使⽤for each row主要是为了使⽤:old和:new伪对象PL/SQL触发器语句即:old、:new伪对象的值详情参照下表:语句:old:newinsert空值插⼊的数据update修改前的数据修改后的数据delete删除前的数据空值语句级触发器的创建和使⽤语法:create [or replace] trigger 触发器名after/beforeinsert/update/delete on 表名declare定义变量begin触发器语句end 触发器名;使⽤语句级触发器实现:在person表插⼊⼀条记录后输出"⼀个新员⼯⼊职"⽰例代码如下:create or replace trigger t1after insert on persondeclarebegindbms_output.put_line('⼀个新员⼯⼊职');end t1;注意,在触发器语句的定义时,存在中⽂,可能会导致触发器创建后,伴随红叉,如不能解决中⽂问题,建议不使⽤中⽂。
⾏级触发器的创建和使⽤语法:create [or replace] trigger 触发器名before/afterinsert/update/deleteon 表名for each rowdeclare声明变量begin触发器语句(可以使⽤:old和:new)end 触发器名;使⽤⾏级触发器实现:在修改emp员⼯信息时,薪⽔下降时报错⽰例代码如下:create or replace trigger t2before update on empfor each rowdeclarebeginif :old.sal > :new.sal thenraise_application_error(-20001,'不能降薪');end if;end t2;注意:raise_application_error(number,varchar2);函数的第⼀个参数的范围为-20001~-20999使⽤触发器实现主键⾃增⽰例代码如下:--使⽤触发器实现主键⾃增create or replace trigger autoidbeforeinsert on personfor each rowdeclarebeginselect s_person.nextval into :new.pid from dual;end autoid;。
简单使用触发器SQL触发器的使用及语法
简单使用触发器SQL触发器的使用及语法SQL触发器是一种特殊类型的存储过程,它是在数据库中一些特定的操作发生时自动执行的。
触发器可以用于在数据被插入、更新或删除时执行一系列的操作。
本文将详细介绍SQL触发器的使用和语法。
1.触发器的类型:SQL触发器可以分为三种类型:插入触发器(INSERT trigger)、更新触发器(UPDATE trigger)和删除触发器(DELETE trigger)。
根据业务需求选择相应的触发器类型。
2.创建触发器:创建触发器需要使用CREATETRIGGER语句。
语法如下:CREATE TRIGGER <trigger_name>{BEFORE,AFTER,INSTEADOF}{INSERT,UPDATE,DELETE}[ON <table_name>][FOREACHROW][WHEN (<condition>)]BEGIN--触发器执行的操作END;其中,trigger_name是触发器的名称;BEFORE / AFTER / INSTEAD OF表示触发器在所指定操作之前、之后或者代替进行;INSERT / UPDATE/ DELETE表示触发器响应的操作类型;table_name是触发器所绑定的表名;FOR EACH ROW表示该触发器对每一行数据都执行;condition是触发器的条件。
3.触发器执行的操作:在触发器的BEGIN和END之间,可以进行一系列的操作,如执行SQL 语句、调用存储过程等。
可以根据业务需求在触发器中编写逻辑代码来满足需求。
4.触发器的应用场景:-数据完整性:可以使用触发器在插入、更新或删除数据时进行一些验证,确保数据的完整性。
例如,在插入新用户之前,可以在触发器中检查用户的必填字段是否为空。
-数据同步:可以使用触发器在数据更新时自动更新其他相关表中的数据,确保数据的同步。
例如,在更新订单信息时,可以在触发器中更新库存表中的相应数据。
sql触发器
sql触发器触发器是⼀种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。
触发器主要是通过事件进⾏触发被⾃动调⽤执⾏的。
⽽存储过程可以通过存储过程的名称被调⽤。
Ø 什么是触发器触发器对表进⾏插⼊、更新、删除的时候会⾃动执⾏的特殊存储过程。
触发器⼀般⽤在check约束更加复杂的约束上⾯。
触发器和普通的存储过程的区别是:触发器是当对某⼀个表进⾏操作。
诸如:update、insert、delete这些操作的时候,系统会⾃动调⽤执⾏该表上对应的触发器。
SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语⾔语句⽽激发,这些语句有create、alter、drop语句。
DML触发器分为:1、 after触发器(之后触发)a、 insert触发器b、 update触发器c、 delete触发器2、 instead of 触发器(之前触发)其中after触发器要求只有执⾏某⼀操作insert、update、delete之后触发器才被触发,且只能定义在表上。
⽽instead of触发器表⽰并不执⾏其定义的操作(insert、update、delete)⽽仅是执⾏触发器本⾝。
既可以在表上定义instead of触发器,也可以在视图上定义。
触发器有两个特殊的表:插⼊表(instered表)和删除表(deleted表)。
这两张是逻辑表也是虚表。
有系统在内存中创建者两张表,不会存储在数据库中。
⽽且两张表的都是只读的,只能读取数据⽽不能修改数据。
这两张表的结果总是与被改触发器应⽤的表的结构相同。
当触发器完成⼯作后,这两张表就会被删除。
Inserted表的数据是插⼊或是修改后的数据,⽽deleted表的数据是更新前的或是删除的数据。
对表的操作Inserted逻辑表Deleted逻辑表增加记录(insert)存放增加的记录⽆删除记录(delete)⽆存放被删除的记录修改记录(update)存放更新后的记录存放更新前的记录Update数据的时候就是先删除表记录,然后增加⼀条记录。
plsql触发器写法
plsql触发器写法PL/SQL触发器是一种特殊的存储过程,它在数据库中的表上自动执行。
当在表上执行特定的操作时,触发器会自动触发并执行相应的代码。
下面是PL/SQL触发器的详细创作步骤:1. 创建触发器使用CREATE TRIGGER语句创建触发器。
语法如下:CREATE [OR REPLACE] TRIGGER trigger_name{BEFORE | AFTER} {INSERT | UPDATE | DELETE}ON table_name[FOR EACH ROW][WHEN condition]DECLARE-- 触发器代码BEGIN-- 触发器代码END;其中,trigger_name是触发器的名称,table_name是触发器所在的表名,BEFORE 或AFTER指定触发器在执行操作之前或之后执行,INSERT、UPDATE或DELETE 指定触发器在执行相应操作时触发,FOR EACH ROW指定触发器对每一行数据都执行,WHEN condition是可选的,用于指定触发器执行的条件。
2. 编写触发器代码在DECLARE和BEGIN-END之间编写触发器代码。
触发器代码可以包括PL/SQL语句、SQL语句和存储过程调用等。
例如,以下是一个简单的触发器代码,用于在插入数据时自动更新另一个表的数据:DECLAREv_count NUMBER;BEGINSELECT COUNT(*) INTO v_count FROM table_name;UPDATE other_table SET count = v_count;END;3. 测试触发器在表上执行相应的操作,触发器会自动执行相应的代码。
可以使用SELECT语句检查触发器是否按预期工作。
4. 修改或删除触发器可以使用ALTER TRIGGER语句修改触发器,使用DROP TRIGGER语句删除触发器。
例如,以下是修改触发器的语法:ALTER TRIGGER trigger_name{ENABLE | DISABLE};其中,ENABLE或DISABLE用于启用或禁用触发器。
Oracle数据库之PLSQL触发器
Oracle数据库之PLSQL触发器Oracle数据库之PL/SQL触发器1. 介绍触发器(trigger)是提供给程序员和数据分析员来保证数据完整性的⼀种⽅法,它是与表事件相关的特殊的存储过程,它的执⾏不是由程序调⽤,也不是⼿⼯启动,⽽是由事件来触发,⽐如当对⼀个表进⾏操作(insert,delete,update)时就会激活它执⾏。
触发器经常⽤于加强数据的完整性约束和业务规则等。
触发器有三种类型,分别是:DML触发器、替代触发器和系统触发器。
DML触发器顾名思义,DML触发器是由DML语句触发的。
例如数据库的INSERT、UPDATE、DELETE操作都可以触发该类型的触发器。
它们可以在这些语句之前或之后触发,或者在⾏级上触发(就是说对于每个受影响的⾏都触发⼀次)。
替代触发器替代触发器只能使⽤在视图上,与DML不同的是,DML触发器是运⾏在DML之外的,⽽替代触发器是代替激发它的DML语句运⾏。
替代触发器是⾏触发器。
系统触发器这种触发器是发⽣在如数据库启动或关闭等系统事件时,不是在执⾏DML语句时发⽣,当然也可以在DDL时触发。
触发器功能强⼤,轻松可靠地实现许多复杂的功能,但是我们也应该慎⽤。
为什么⼜要慎⽤呢?触发器本⾝没有过错,但如果我们滥⽤,会造成数据库及应⽤程序的维护困难。
在数据库操作中,我们可以通过关系、触发器、存储过程、应⽤程序等来实现数据操作,同时约束、缺省值也是保证数据完整性的重要保障。
如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度。
2. 触发器组成触发器主要由以下⼏个要素组成:1. 触发事件:引起触发器被触发的事件。
2. 触发时间:触发器是在触发事件发⽣之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该触发器的操作顺序。
3. 触发操作:触发器被触发之后的⽬的和意图,是触发器本⾝要做的事情。
4. 触发对象:包括表、视图、模式、数据库。
Oracle_PLSQL_编程语法详解-触发器
第八章触发器触发器是许多关系数据库系统都提供的一项技术。
在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块。
§8.1 触发器类型触发器在数据库里以独立的对象存储,它与存储过程不同的是,存储过程通过其它程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行。
即触发器是当某个事件发生时自动地隐式运行。
并且,触发器不能接收参数。
所以运行触发器就叫触发或点火(firing)。
ORACLE事件指的是对数据库的表进行的INSERT、UPDATE及DELETE操作或对视图进行类似的操作。
ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。
§8.1.1 DML触发器ORACLE可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。
§8.1.2 替代触发器由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。
所以给出了替代触发器。
它就是ORACLE 8专门为进行视图操作的一种处理方法。
§8.1.3 系统触发器ORACLE 8i 提供了第三种类型的触发器叫系统触发器。
它可以在ORACLE数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等。
触发器组成:●触发事件:即在何种情况下触发TRIGGER; 例如:INSERT, UPDATE, DELETE。
●触发时间:即该TRIGGER 是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER 的操作顺序。
●触发器本身:即该TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。
例如:PL/SQL 块。
●触发频率:说明触发器内定义的动作被执行的次数。
即语句级(STATEMENT)触发器和行级(ROW)触发器。
语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次;行级(ROW)触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。
PLSQL触发器详解-2
executing temp_air
executing temp_air
SQL>
尽管第三个Insert语句是一条SQL语句,但插入TEMP表中两条记录。许多insert语句插入一条记录,但可以用一条语句插入许多行。
2、触发语句
比如:
表或视图上的DML语句
DDL语句
数据库关闭或启动,startup shutdown等等
before insert or update
of department_id
on employees
referencing old as old_value
new as new_value
for each row
2、建立日志表
create table employees_log(
who varchar2(30),
when date);
3、在employees_copy表上建立语句触发器,在触发器中填充employees_log表。
Create or replace trigger biud_employee_copy
values( 12345,’Chen’,’Donny’, sysdate, 12,‘donny@’,60,10000,.25);
select commission_pct from employees where employee_id=12345;
触发器不会通知用户,便改变了用户的输入值。
referencing:指定新行(即将更新)和旧行(更新前)的其他名称,默认为new和old。
第07章OraclePLSQL语言基础_控制语句_过程_触发器
控制结构 ▪ PL/SQL可用于创建存储过程、触发器和程序包,也可以用来
处理业务规则、数据库事件或给SQL命令的执行添加程序逻 辑
支持SQL 支持面向对象编程(OOP) 更好的性能 可移植性 与SQL集成 安全性
▪ 和变量在使用前必须声明,可以使用DECLARE对变量进行 声明,语法如下:
DECLARE <变量名> <变量类型>:=默认值; ….
▪ 在DECLARE块中可以同时声明多个常量和变量。声明普通 常量或变量是需要说明以下信息:
✓ 常量或变量的名称 ✓ 常量或变量的数据类型
变量说明
说明变量 (char, varchar2, date, number, boolean, long)
案例-2:
使用SET SERVEROUTPUT ON命令设置环境变量 SERVEROUTPUT为打开状态,从而使PL/SQL程序 能够在SQL*Plus中输出结果
使用函数DBMS_OUTPUT.PUT_LINE()可以输出参数 的值
PL/SQL程序的执行部分
PL/SQL程序的执行部分包括
▪ 赋值语句 ▪ 流程控制语句 ▪ SQL语句 ▪ 游标语句
✓ 加(+)、减(-) 、乘(*) 、除(/) 、乘方(**)和连接(||)
▪ 关系运算符
✓ =、<>(或!=)、<、>、>=、<=、BETWEEN...AND...、IN、 LIKE、IS NULL
▪ 逻辑运算符
✓ 逻辑与(AND) 、逻辑或(OR) 、逻辑非(NOT)
plsql基础(数据类型、定义变量)、游标、过程、函数、包、触发器(系统触发器)
【原创】oracle的学习六:pl/sql基础(数据类型、定义变量)、游标、过程、函数、包、触发器(系统触发器)2011-07-27 21:42:48| 分类:ORACLE | 标签:pl/sql基础数据类型定义变量游标、过程、函数包、触发器|字号大中小订阅1.PL/SQL的介绍∙pl/sql是什么pl/sql是oracle在标准sql语言上的扩展。
pl/sql不仅允许嵌入sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用另外处理各种错误,功能强大。
∙为什么学pl/sql优点:1.提高应用程序的运行性能2.模块化得设计思想3.减少网络传输量4.提高数据库访问的安全性缺点:移植性不好∙开发工具:环境设置:∙页大小和行大小:set pagesize 50 linesize 120;∙更改日期格式:alter session setnls_date_format='YY-MM-DD HH24:MI:SS';∙为使用程序包DBMS_OUTPUT中的PUT_LINE过程输出: set serveroutput on;1.sqlplus---oracle公司提供的一个工具。
2.pl/sql developer 开发工具pl/sql developer 是用于开发pl/sql块的IDE,独立的产品。
举例:创建过程:create [or replace ] procedure 过程名is begin----执行过程end;/replace:表示如果存在过程名,就替换。
--:注释查看错误信息:show error调用过程:法一:exec 过程名(参数列);法二:call 过程名(参数列);∙块的类型所有的PL/Sql程序都是以块为基本单位。
块包含过程化语句和DML 语句。
块的分类:∙匿名块:出现在应用程序中的、没有名字、不存储在数据库中的块。
可以出现在SQL语句出现的地方。
可以调用其他程序,不能被调用。
PLSQL触发器
1、触发器概述:触发器是一种特殊的存储过程,与普通存储过程不同的是,触发器是当某些事件发生时,由Oracle自动执行,可以说是隐藏执行的存储过程。
2、触发器的组成:触发器由触发事件、触发条件和触发操作三部分组成(1)触发事件:触发事件可以是对特定表或视图的DML操作(insert、update、delete等)、在任何方案的DDL语句(create、alter、drop等)、数据库系统事件(系统启动、退出、异常错误等)以及其他用户事件(用户登录或断开会话等)。
(2)触发条件:执行触发器的条件,即只有为TRUE时才会执行触发器,在行触发器上指定触发条件,语句级触发器不允许指定。
(3)触发操作:触发器所要执行的操作,是包含sql语句和其他代码的PL/SQL块。
触发操作中只能包含select、insert、update和delete语句,不能包含DDL语句(create、alter、drop)。
注意:触发器的总大小不能超过32K;不能是事务控制语句(commit、rollback、savepoint);触发器中不能对对应的基表执行查询操作;同时注意语句重启动问题,即某一数据使用了触发器,用户1和用户2同时修改该数据,用户2被阻塞,用户1提交数据后,用户2才能对其操作,这时用户2的触发器执行了两次,一次是原始条件的触发,第二次是用户1修改数据后,触发器又一次的触发。
3、创建语句级触发器(每次触发被执行一次):语句级触发器是指当执行DML语句时,以语句为单位执行的触发器,即语句执行一次,触发器执行一次。
语法:create [or replace] trigger triggerNamebefore | afterinsert | update | delete [of column1[,column2…]]on tablePL/SQL块| call 过程名;解释:or replace表示若触发器存在,则替换之;triggerName为触发器名;before表示在执行DML操作之前触发,after表示在执行DML操作后触发;insert等DML语句指定触发事件,多个事件用or分割;of column指定触发的列;table是要执行触发器的表名;PL/SQL 块表示触发器执行的操作,call表示触发器执行已存在的过程。
16-PLSQL高级-2
• 重新编译触发器
– alter trigger trigger_name compile;
• 删除触发器
– drop trigger trigger_name
语句级DML触发器应用
• 安全性控制
– 对用户操作数据库时,进行时间的合法性检查,对于 非法时间段内的数据库特定表修改进行阻止。(非法 时间段是非工作时间)
• 安全审核
– 创建一个审核表,针对emp表的任何修改都如实的记录 下来。
行级DML触发器
CREATE [OR REPLACE] TRIGGER trigger_name --触发器名 {BEFORE | AFTER} --触发时机 {insert | update | delete [of column1[,column2,…]]}[Or insert | update | delete [of column3[,column4,…]]}…] --触发事件 ON {table_name|view_name} --触发对象 FOR EACH ROW --行级触发 [WHEN condition] --触发条件 PL/SQL_block | call procedure_name; --触发动作
• • • 由DML语句执行的DML操作所影响的行为单位触发 可能执行多次,因为一个DML语句可能操作多行 行级触发器可以访问列值
Hale Waihona Puke 行级DML触发器限定词• 行级触发器可以对列值进行访问
– 在列名前加上old.限定词表示变化前的值 – 在列名前加上new.限定词表示变化后的值 – 在PL/SQL块或SQL语句中应用时,前面要加‘:’,但是,在 when condition子句中不用加 触发语句 Insert Update Delete :old :new
SQL触发器实例讲解
SQL触发器实例讲解定义:何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。
触发器是一个特殊的存储过程。
常见的触发器有三种:分别应用于Insert , Update , Delete 事件。
我为什么要使用触发器?比如,这么两个表:Create Table Student( --学生表StudentID int primary key, --学号....)Create Table BorrowRecord( --学生借书记录表BorrowRecord int identity(1,1), --流水号StudentID int , --学号BorrowDate datetime, --借出时间ReturnDAte Datetime, --归还时间...)用到的功能有:1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
等等。
这时候可以用到触发器。
对于1,创建一个Update触发器:Create Trigger truStudentOn Student --在Student表中创建触发器for Update --为什么事件触发As --事件触发后所要做的事情if Update(StudentID)beginUpdate BorrowRecordSet StudentID=i.StudentIDFrom BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted临时表Where br.StudentID=d.StudentIDend理解触发器里面的两个临时的表:Deleted , Inserted 。
注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
oracle_PL_SQL学习笔记(sql与触发器、存储过程等)
oracle_PL_SQL学习笔记(sql与触发器、存储过程等)Oracle学习笔记李铁峰(2003-01-10)这篇笔记主要总结了机械工业出版社的《Oracle8 PL/SQL程序设计》的主要语法和内置函数部分1第一章PL/SQL简介1.1 块结构(Block)DECLARE --declarative section/*声明部分,声明变量(variables)、类型(types)、游标(cursors)和局部子程序*/BEGIN --executable section/*执行部分,放置过程性语句(procedural statement)*或SQL语句(SQL statemnet)。
*这是主体,是必须的。
*/EXCTPTION --exception section/*错误处理部分*/END; //“;”很关键,不要忘记1.2 变量和类型(variables and types)支持各种常用的数据库类型,还支持用户自定义类型,如表(table)、记录(record)。
还支持对象类型。
1.3 注释(comment)Oracle的PL/SQL支持"--"和“/* */”的注释风格。
2第二章PL/SQL基础2.1 PL/SQL块匿名块(anonymous)动态生成,只执行一次。
带名块(named)是带有标签的匿名块,动态生成,只执行一次。
子程序(subprogram)是存储在数据库内部的过程、函数和包。
可多次执行。
触发器(trigger)是存储在数据库内部的带名块,可多次执行。
由触发事件(triggering event)来触发。
2.2 词法单位(lexical unit)包括标识符(identifier)、分界符(delimiter)、文字(literal)和注释(comment)2.2.1标识符(identifier)PL/SQL对大小写不敏感。
最长30位。
a)保留字(reserved word)或关键字(keyword),保留字单独使用时是保留的,但可以出现在其他标识符的内部。
sql中触发器相关用法
sql中触发器相关用法SQL中的触发器是一种特殊的存储过程,它会在特定的数据库操作(如插入、更新、删除)发生时自动执行。
触发器可以用来维护数据的完整性、实现业务规则、日志记录等。
下面我将从触发器的创建、类型、语法和示例等方面介绍相关用法。
1. 创建触发器:在SQL中,可以使用CREATE TRIGGER语句来创建触发器。
语法通常如下:sql.CREATE TRIGGER trigger_name.{BEFORE | AFTER} {INSERT | UPDATE | DELETE}。
ON table_name.FOR EACH ROW.BEGIN.-触发器执行的操作。
END;在这个语法中,trigger_name是触发器的名称,BEFORE或AFTER表示触发的时间点,INSERT、UPDATE、DELETE表示触发的操作,table_name是触发器所在的表,FOR EACH ROW表示每行触发。
2. 触发器类型:BEFORE触发器,在触发操作执行之前触发,可以用来进行数据验证或修改。
AFTER触发器,在触发操作执行之后触发,可以用来记录日志或执行其他后续操作。
3. 触发器语法:触发器的语法包括触发时机(BEFORE或AFTER)、触发的操作(INSERT、UPDATE、DELETE)、触发的表和触发器执行的操作。
在BEGIN和END之间编写触发器的具体逻辑,可以是SQL语句或调用存储过程。
4. 触发器示例:下面是一个简单的触发器示例,当在表中插入新记录时,自动更新另一张表的相关数据:sql.CREATE TRIGGER update_other_table.AFTER INSERT.ON main_table.FOR EACH ROW.BEGIN.UPDATE other_table.SET related_column = related_column + 1。
WHERE id = NEW.id;END;在这个示例中,触发器update_other_table在main_table表中有新记录插入时触发,然后更新other_table表中相关的数据。
sql 触发器类型
sql 触发器类型SQL触发器类型在数据库管理系统中,触发器(Trigger)是一种特殊的存储过程,它与表相关联,并在特定的数据库事件发生时自动执行。
触发器可以用来维护数据的完整性、实施业务规则以及执行复杂的数据操作。
在SQL中,触发器通常分为以下几种类型:插入触发器、删除触发器和更新触发器。
本文将对每种触发器类型进行详细介绍。
一、插入触发器插入触发器是在向表中插入新行时触发执行的触发器。
通过插入触发器,可以在新行插入之前或之后执行一系列操作。
插入触发器通常用于验证插入的数据是否符合业务规则,或者在插入数据后执行一些其他操作,如更新相关表的数据等。
二、删除触发器删除触发器是在从表中删除行时触发执行的触发器。
通过删除触发器,可以在删除行之前或之后执行一系列操作。
删除触发器通常用于验证删除的数据是否符合业务规则,或者在删除数据后执行一些其他操作,如记录删除日志等。
三、更新触发器更新触发器是在更新表中的行时触发执行的触发器。
通过更新触发器,可以在更新行之前或之后执行一系列操作。
更新触发器通常用于验证更新的数据是否符合业务规则,或者在更新数据后执行一些其他操作,如更新相关表的数据等。
触发器的创建和使用是通过SQL语句来完成的。
下面以插入触发器为例,介绍触发器的创建过程:1. 创建触发器```sqlCREATE TRIGGER trigger_nameAFTER INSERT ON table_nameFOR EACH ROWBEGIN-- 触发器操作END;```2. 定义触发器操作触发器操作可以包括SQL语句、存储过程或函数等。
可以在触发器操作中执行各种数据库操作,如更新表数据、插入新数据、删除数据等。
3. 使用触发器在创建触发器后,可以通过插入新行来触发触发器的执行。
每当插入新行时,触发器会自动执行相应的操作。
触发器在数据库管理系统中有着广泛的应用。
通过合理使用触发器,可以提高数据库的数据完整性和业务规则的执行效率。
ORACLE PLSQL编程之八-把触发器说透
ORACLE PL/SQL编程之八:把触发器说透摘自和讯网特性INSERTUPDATEDELETEOLDNULL实际值实际值NEW实际值实际值NULL 例1: 建立一个触发器, 当职工表emp 表被删除一条记录时,把被删除记录写到职工表删除日志表中去。
CREATE TABLE emp_his AS SELECT * FROM EMP WHERE 1=2;CREATE OR REPLACE TRIGGER tr_del_empBEFORE DELETE 指定触发时机为删除操作前触发ON scott.empFOR EACH ROW 说明创建的是行级触发器BEGIN将修改前数据插入到日志记录表del_emp ,以供监督使用。
INSERT INTO emp_his(deptno , empno, ename , job ,mgr , sal , comm , hiredate )VALUES( :old.deptno, :old.empno, :old.ename , :old.job,:old.mgr, :old.sal, :m, :old.hireda te );END;DELETE emp WHERE empno=7788;DROP TABLE emp_his;DROP TRIGGER del_emp;例2:限制对Departments表修改(包括INSERT,DELETE,UPDATE)的时间范围,即不允许在非工作时间修改departments表。
CREATE OR REPLACE TRIGGER tr_dept_timeBEFORE INSERT OR DELETE OR UPDATEON departmentsBEGINIF (TO_CHAR(sysdate,"DAY") IN ("星期六", "星期日")) OR (TO_CHAR(sysdate,"HH24:MI") NOT BETWEEN "08:30" AND "18:00") THENRAISE_APPLICATION_ERROR(-20001, "不是上班时间,不能修改departments表");END IF;END;例3:限定只对部门号为80的记录进行行触发器操作。
PLSQL教程
四 Insert触发器的创建: create or replace trigger tg_insert before insert on person begin dbms_output.put_line('insert trigger is chufa le end;
.....');
五 update表级触发器的例子: create or replace trigger tg_updatestudent after update on student begin dbms_output.put_line('update trigger is chufale .....'); end;
例子: 要求:
在向Employees表添加数据的时候,通过触发器向表employee_temp中写入一条相同数
create or replace trigger temp_1 after insert on employees for each row declare begin insert into employee_temp(id,name,salary) values (:new.id,:st_name,:new.salary); end temp_1;
六 delete testudent before delete on student for each row begin dbms_output.put_line(‘删除成功’); end; 七 当触发器被触发时,如果需要使用被插入、更新或删除的记录中的列值,该如何处理 解决办法: :new 访问操作完成后列的值 :old 访问操作完成前列的值 :new 和 :old在使用时的限制: 特性 :OLD :NEW INSERT null 有效 UPDATE 有效 有效 DELETE 有效 null
PLSQL编写触发器
PLSQL编写触发器【转⾃】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变量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Trigger Body written PL/SQL
END;
·Trigger_name
用触发器名来确定表名和触发器类型。PL/SQL运行时错误将产生一个PL/SQL错误信息,涉及触发器名和行数。下面Oracle错误显示了在students表上的AFTER-INSERT行触发器的第5行有一个被0除错误。
values(12345,’Chen’,’Donny@hotmail’,sysdate,12);
select *from employees_log
总结:语句级触发器.(语句级触发器对每个DML语句执行一次)是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器。能够与INSERT、UPDATE、DELETE或者组合上进行关联。但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次。比如,无论update多少行,也只会调用一次update语句触发器。
触发器类型:
1、语句触发器
2、行触发器
3、INSTEAD OF触发器
4、系统条件触发器
5、用户事件触发器
注释:
before和after:指在事件发生之前或之后激活触发器。
instead of:如果使用此子句,表示可以执行触发器代码来代替导致触发器调用的事件。
insert、delete和update:指定构成触发器事件的数据操纵类型,update还可以制定列的列表。
declare---end:是一个标准的PL/SQL块。
Oracle触发器详细介绍二--语句触发器
1、语句触发器
是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器。能够与INSERT、UPDATE、DELETE或者组合上进行关联。但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次。比如,无论update多少行,也只会调用一次update语句触发器。
before insert or update
of department_id
on employees
referencing old as old_value
new as new_value
for each row
when (new_value.department_id<>80 )
begin
:new_mission_pct :=0;
例子:
需要对在表上进行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表
[试验]
对修改表的时间、人物进行日志记录。
1、建立试验表
create table employees_copy as select * from hr.employees
2、行级触发器语法:
CREATE OR REPLACE TRIGGER trigger_name
AFTER|BEFORE INSERT|UPDATE|DELETE ON table_name
FOR EACH ROW
[WHEN (Boolean expression)]
DECLARE
Local declarations
referencing:指定新行(即将更新)和旧行(更新前)的其他名称,默认为new和old。
table_or_view_name:指要创建触发器的表或视图的名称。
for each row:指定是否对受影响的每行都执行触发器,即行级触发器,如果不使用此子句,则为语句级触发器。
when:限制执行触发器的条件,该条件可以包括新旧数据值得检查。
2、触发语句
比如:
表或视图上的DML语句
DDL语句
数据库关闭或启动,startup shutdown等等
before insert or update
of department_id
on employees
referencing old as old_value
new as new_value
for each row
其中的new_value是代表更新之后的值。
4、触发操作
是触发器的主体
begin
:new_mission_pct :=0;
end;
主体很简单,就是将更新后的commission_pct列置为0
触发:
insert into employees(employee_id,
last_name,first_name,hire_date,job_id,email,department_id,salary,commission_pct )
6 END;
7 /
8 SQL> INSERT INTO temp VALUES (1); -- insert 1 row
executing temp_air
SQL> INSERT INTO temp SELECT * FROM temp; -- insert 1 row
executing temp_air
Insert into employees_log(
Who,action,when)
Values( user, l_action,sysdate);
End;
/
3、测试
insert into employees_copy( employee_id, last_name, email, hire_date, job_id)
Oracle触发器详细介绍
Oracle触发器详细介绍一
触发器
是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。
功能:
1、允许/限制对表的修改
2、自动生成派生列,比如自增字段
3、强制数据一致性
4、提供审计和日志记录
5、防止无效的事务处理
6、启用复杂的业务逻辑
开始
create trigger biufer_employees_department_id
ORA-01476: divisor is equal to zero
ORA-06512: at "SCOTT.STUDENTS_AIR", line 5
ORA-04088: error during execution of trigger
'SCOTT.STUDENTS_AIR'
行记数从关键字DECLARE行开始,如果没有DECLARE部分,BEGIN语句是第一行。触发器名称存储在USER_TRIGGERS表的TRIGGER_NAME。触发器名一般由表名、触发器类型、触发事件,语法如下:
实例:
create or replace trigger tri_test
after insert or update or delete on test
begin
if updating then
dbms_output.put_line('修改');
elsif deleting then
dbms_output.put_line('删除');
elsif deleting then
end if;
end;
if updating(‘COL1’) or updating(‘COL2’) then
------
end if;
[试验]
1、修改日志表
alter table employees_log
add (action varchar2(20));
2、修改触发器,以便记录语句类型。
SQL> INSERT INTO temp SELECT * FROM temp; -- inserts 2 rows
executing temp_air
executing temp_air
SQL>
尽管第三个Insert语句是一条SQL语句,但插入TEMP表中两条记录。许多insert语句插入一条记录,但可以用一条语句插入许多行。
说明:
1、无论是否规定了department_id,对employees表进行insert的时候
2、对employees表的department_id列进行update的时候
3、触发器限制
when (new_value.department_id<>80 )
限制不是必须的。此例表示如果列department_id不等于80的时候,触发器就会执行。
select * from employess_log;
5、确定是哪个语句起作用?
即是INSERT/UPDATE/DELETE中的哪一个触发了触发器?
可以在触发器中使用INSERTING / UPDATING / DELETING条件谓词,作判断:
begin
if inserting then
elsif updating then
end;
/
触发器的组成部分:
1、触发器名称
2、触发语句
3、触发器限制
4、触发操作
1、触发器名称
create trigger biufer_employees_department_id
命名习惯: