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. <NET CLR via c# 第4版> 读书笔记--目录

    <NET CLR via c# 第4版>个别章节虽读过多次,但始终没有完整读过这本书.即使看过的那些,时间一长,也忘记了大部分.趁着最近不忙,想把这本书好好读一遍,顺便记下笔记,方便随时查 ...

  2. 特征选择: 卡方检验、F 检验和互信息

    特征选择是特征工程中的重要一环,其主要目的是从所有特征中选出相关特征 (relevant feature),或者说在不引起重要信息丢失的前提下去除掉无关特征 (irrelevant feature) ...

  3. 2018-2019-2 网络对抗技术 20165202 Exp4 恶意代码分析

    博客目录 一.实践目标 二.实践内容 1.系统运行监控 2.恶意软件分析 三.实验步骤 四.基础问题回答 五.遇到的问题及解决 六.实验总结 一.实践目标 监控你自己系统的运行状态,看有没有可疑的程序 ...

  4. PostgreSQL数据库创建只读用户总结

    好久没有弄,有点忘了,今天有客户问这个问题,发现几个SQL还解决不了,于是总结一下: --以超级用户登录数据库,创建用户: postgres=# create user test_read_only ...

  5. memmove 对同一个指针不操作

    memmove 对同一个指针不操作,所以调用memmove之前不用比较两个指针是否相同 void CTestDLLDlg::OnBnClickedButton6() { ; char* data = ...

  6. 理解 js的 async/await

    async 和await 在干什么? async  用于声明一个function是异步的 await用于等待一个异步方法执行完成(其实我理解的是等待的是一个表达式,就是一个结果), 其中  await ...

  7. WEB接口测试之Jmeter接口测试自动化 (四)

    Jmeter是压力测试.接口测试工具,Ant是基于Java的构建工具,具有跨平台的作用,jenkins是持续集成工具.将这三者结合起来可以搭建一套webservice接口测试的持续构建环境.   1. ...

  8. SIM800C Couldn't pair with xxx because of an incorrect PIN or passkey

    /******************************************************************************* * SIM800C Couldn't ...

  9. Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayShowHomeEnabled(boolean)' on a null object reference

    /********************************************************************************* * Caused by: java ...

  10. I.MX6 Ar8031 device register hacking

    /***************************************************************************** * I.MX6 Ar8031 device ...