Oracle触发器

一、触发器简介                                          

具备某些条件,由数据库自动执行的一些DML操作行为;

二、语句触发器                                          

现在数据库创建t_book表;t_booktype表:t_book表的typeid存在外键参考t_booktype的id:

1.需求:当前用户不是CC时,insert/delete/update t_book表就提示‘权限不足’:

SQL> create or replace trigger tr_book
2 before insert or update or delete
3 on t_book
4 begin
5 if user!='CC' then
6 raise_application_error(-20001,user||'权限不足');
7 end if;
8 end;
9 / 触发器已创建 //如果没有创建触发器的权限,sys dba登陆:
SQL> grant create trigger to c##chengyu;

当前用户为c##chengyu,在t_book中插入数据报错:

SQL> insert into t_book values(4, 'xxx', 1);
insert into t_book values(4, 'xxx', 1)
*
第 1 行出现错误:
ORA-20001: C##CHENGYU权限不足
ORA-06512: 在 "C##CHENGYU.TR_BOOK", line 3
ORA-04088: 触发器 'C##CHENGYU.TR_BOOK' 执行过程中出错

2.触发器谓词: 把用户的某些操作记录在日志中: 现在将t_book的增、删、改操作记录到t_book_log这个表中:

SQL> create or replace trigger tr_book_log
2 after insert or update or delete
3 on t_book
4 begin
5 if updating then
6 insert into t_book_log values(user,'update',sysdate);
7 else if inserting then
8 insert into t_book_log values(user,'insert',sysdate);
9 else if deleting then
10 insert into t_book_log values(user,'delete',sysdate);
11 end if;
12 end if;
13 end if;
14 end;
15 / 触发器已创建 //user:内置变量,能够获取到当前用户;

进行一些增、删、改的操作,查看t_book_log记录的日志:

三、行触发器                                          

现在需求是 由触发器来维护t_booktype的num这个字段;当t_book的typeId为1的 有insert/delete时,触发器自动更新t_booktype表的num字段:
SQL> create trigger tr_book_add
2 after insert
3 on t_book
4 for each row
5 begin
6 update t_booktype set num = num+1 where id=:new.typeid;
7 end;
8 / 触发器已创建 SQL> create trigger tr_book_delete
2 after delete
3 on t_book
4 for each row
5 begin
6 update t_booktype set num = num-1 where id=:old.typeid;
7 end;
8 / 触发器已创建 //:new 新增的行记录
//:old 删除的行记录;

现在新增记录,查看num已自动维护:

SQL> delete from t_book where id = 4;

已删除 1 行。

SQL> select * from t_booktype;

ID TYPENAME NUM
---------- ---------- ----------
1 计算机类 2
2 生物类 1

四、触发器禁用和开启                                    

禁用不等于删除,只是将其不起作用,可以再次开启;

Oracle学习操作(5)触发器的更多相关文章

  1. Oracle 学习笔记 19 -- 触发器和包浅析(PL/SQL)

    触发器是存放在数据库中的一种特殊类型的子程序.不能被用户直接调用,而是当特定事件或操作发生时由系统自己主动 调用执行.触发器不能接受參数.所以执行触发器就叫做触发或点火.Oracle事件指的是数据库的 ...

  2. oracle学习操作(1)

    一.oracle表及表空间: 1.查看用户.用户表空间等,需要sysdba登陆: select username, default_tablespace from dba_users;   2.一个数 ...

  3. Oracle学习笔记之触发器

    触发器 触发器(trigger)是一些过程,与表关系密切,用于保护表中的数据,当一个基表被修改(INSERT.UPDATE或DELETE)时,触发器自动执行,例如通过触发器可实现多个表间数据的一致性和 ...

  4. oracle 学习笔记之触发器

    说明 数据库触发器是一个与表相关联的.存储的PL/SQL程序. 每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle自己主动地运行触发器中定义的语句序 ...

  5. Oracle学习笔记十三 触发器

    简介 触发器是当特定事件出现时自动执行的存储过程,特定事件可以是执行更新的DML语句和DDL语句,触发器不能被显式调用.   触发器的功能: 1.自动生成数据 2.自定义复杂的安全权限 3.提供审计和 ...

  6. Oracle学习操作(7)用户、权限、角色

    一.oracle用户: 二.权限 1.系统权限: sys登陆创建c##test用户后,给用户c##test授权,并且带有传播性: SQL> create user c##test identif ...

  7. Oracle学习操作(6)函数与存储过程

    一.oracle自定义函数 1.不带参数的函数: 返回t_book表的总条数: SQL> create function getBookCount return number as begin ...

  8. Oracle学习操作(3)

    一.if条件语句 set serverout on; ; v ):='world'; begin dbms_output.put_line('hello'||n||v); end; / hello1w ...

  9. Oracle 学习之触发器

    1. 触发器简介 触发器是存储在数据库服务器中的程序单元,当一个表或一个视图被改变,或者数据库发生某些事件时,Oracle会自动触发触发器,并执行触发器中的代码.只有在触发器中定义的事件发生时,触发器 ...

随机推荐

  1. Kafka消费者APi

    Kafka客户端从集群中消费消息,并透明地处理kafka集群中出现故障服务器,透明地调节适应集群中变化的数据分区.也和服务器交互,平衡均衡消费者. public class KafkaConsumer ...

  2. SpingBoot三——基础架构

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:https://www.cnblogs.com/by-dream/p/10492073.html 继续上一节,为了更好的开发,现将 ...

  3. ipython与sublime调用其shell出现的问题

    本机电脑 win10 已安装python3.5 1.    直接在命令行运行 pip install ipython[all] 安装 ipython 安装完成后 在命令行输入 jupyter note ...

  4. Python的generator生成器

    generator保存的是算法,元素仅在使用的时候生成,占用内存小,总元素的个数可以是无限个. 简单的生成器与列表生成式,区别仅在于将中括号[ ],换成小圆括号( ). In [1]: g=(x*x+ ...

  5. 玩转X-CTR100 l STM32F4 l U-Blox NEO-6M GPS卫星定位-nmealib解码库移植解码

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 扩展GPS ...

  6. STL标准库-Tuple

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 在前面我介绍过一次tuple,今天在书上也看到了tuple,那就在写一次吧. tuple(元组),他的内部可以放任意类型的变量( ...

  7. php require include 区别

    php提供了两种包含外部文件的方法:include()和require().include()语句是一个常规的php函数:而require() 是一种特殊的语言结构,它的使用受到一些限制.对这两者来说 ...

  8. exit和return

    函数名: exit() 所在头文件:stdlib.h(如果是”VC6.0“的话头文件为:windows.h) 功 能: 关闭所有文件,终止正在执行的进程. exit(1)表示异常退出.这个1是返回给操 ...

  9. shell 脚本实战笔记(10)--spark集群脚本片段念念碎

    前言: 通过对spark集群脚本的研读, 对一些重要的shell脚本技巧, 做下笔记. *). 取当前脚本的目录 sbin=`dirname "$0"` sbin=`cd &quo ...

  10. DelaunayTriangulation_VoronoiDiagram_using_OpenCV的实现

    前言 最近project中有关于delaunay的实现问题,查找资料,看到learnopencv这个网站,有很多peoject的实现,本文主要是实现Delaunay Triangulation and ...