PLSQL触发器
触发器权限
数据库创建用户时想要在本用户下使用触发器,需要给用户触发器的权限
使用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;
PLSQL触发器的更多相关文章
- PLSQL触发器,游标
--触发器 drop table emp_log create table emp_log( empno number, log_date date, new_salary number, actio ...
- Oracle plsql 触发器 查询/启用/停止
在PLSQL中查询某个表的触发器脚本 select * from user_triggers where table_name='xxx' oracle触发器的启用和停用 1.禁用 table_nam ...
- SQL记录-PLSQL触发器
PL/SQL触发器 触发器是存储程序,它会自动执行或发射当一些事件发生.触发器,事实上,写入响应于以下任一事件将被执行: 数据库操作(DML)语句(DELETE,INSERT,UPDATE或) 数据库 ...
- PLSQL 触发器
触发器权限 数据库创建用户时想要在本用户下使用触发器,需要给用户触发器的权限 使用DBA用户执行 GRANT CREATE TRIGGER TO user_name; 如果想在当前用户下创建其他用户 ...
- plsql 触发器介绍 语句级别触发器、行级别触发器。
/* 分类: 1.DDL触发器 执行create,alter,drop操作时,会激活的触发器 2.DML触发器 执行增.删除.修改时,激活的触发器 3.系统事件触发器 执行特定的系统事件时(启动.加载 ...
- Oracle-4 - :超级适合初学者的入门级笔记:plsql,基本语法,记录类型,循环,游标,异常处理,存储过程,存储函数,触发器
初学者可以从查询到现在的pl/sql的内容都可以在我这里的笔记中找到,希望能帮到大家,视频资源在 资源, 我自己的全套笔记在 笔记 在pl/sql中可以继续使用的sql关键字有:update del ...
- 【PLSQL】触发器trigger类型,状态,參数
************************************************************************ ****原文:blog.csdn.net/clar ...
- plsql创建一个表、序列、和触发器
plsql创建表后不能直接让id递增,因此要手动创建,下面是例子: 1.创建表 SQL: create table student(id number primary key,name varchar ...
- oracle(sql)基础篇系列(五)——PLSQL、游标、存储过程、触发器
PL/SQL PL/SQL 简介 每一种数据库都有这样的一种语言,PL/SQL 是在Oracle里面的一种编程语言,在Oracle内部使用的编程语言.我们知道SQL语言是没有分支和循环的,而PL语 ...
随机推荐
- 入门经典——基础数据结构专题(List)
UVA127 链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- IO的五种模型
为了区分IO的五种模型,下面先来看看同步与异步.阻塞与非阻塞的概念差别. 同步:所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.按照这个定义,其实绝大多数函数都是同步调用(例如 ...
- centos 上网问题
前言:由于Linux下很多软件安装必须网络环境下进行,因此,对于如何在VMware下进行上网,我折腾了至少三天,今天上午,也即五一劳动节,终于搜到一遍技术文章,经过自己实践,VMware下Linux的 ...
- StackExchange.Redis 官方文档(一) Basics
基本使用方法: StackExchange.Redis的核心是 StackExchange.Redis 命名空间的 ConnectionMultiplexer 类;它隐藏了多服务器的实现细节.Conn ...
- 微信小程序之----navigator页面跳转
navigator navigator跳转页面样式分为两种一种是左上角带返回按钮跳转到新的页面,另一种不带即在本页跳转,通过控制redirect属性 .js <view> <navi ...
- 已知从BUF开始存放了10个字类型有符号数据,编程求出这10个数中的最大数和最小数(将最大数存入MAX字单元、最小数存入MIN字单元),并将其以10进制数的形式在屏幕上显示出来。
data segment pmax db 0dh,0ah , 'MAX : ','$' pmin db 0dh,0ah , 'MIN : ','$' buf ...
- [Angular Tutorial] 5-Filtering Repeaters
在上一步中,我们花了很大功夫来布局应用的基础,所以我们现在做点简单点的吧!我们将会添加一个全文本搜索框(没错,这很简单). ·我们的应用现在会有一个搜索框,注意页面中手机列表的改变取决于用户在搜索框键 ...
- 如何解决Ajax跨域问题-1
如何解决Ajax跨域问题 最近在做AJAX调用C的问题,出现跨域问题,学习总结如下: 在做ajax读取数据的时候,经常会遇到ajax需要跨域的问题,但由于浏览器安全方面的限制,XMLHttpReque ...
- iOS 之 关闭键盘
//方法一:关闭整个系统的键盘 [[[UIApplication sharedApplication] keyWindow] endEditing:YES]; //方法二:关闭当前页的键盘 [[sel ...
- [c#]解决方案:需要“jquery”ScriptResourceMapping。请添加一个名为 jquery (区分大小写)的 ScriptResourceMapping。
问题详情 如下图所示(部分): 出现该错误,是因为应用程序中需要使用到jquery(现在的web应用程序哪个能离开jquery呢),而目前程序目录中并没有jquery文件,或者有jquery文件但是程 ...