oracle_触发器

创建触发器

CREATE [or REPLACE] TRIGGER 触发器名

{BEFORE | AFTER}

{DELETE | INSERT | UPDATE [OF 列明]}

ON 表名

[FOR EACH ROW [WHEN(条件)]]    --指明触发器类型,有这个语句就指明是行级触发器,否则就是语句级触发器

PLSQL块

==================================================================

语句级触发器

  在指定的操作语句之前或者之后执行一次,不管这条语句影响了多少行。

行级触发器

  触发语句作用 的每一条记录都被触发。在行级触发器中使用:old和:new 伪记录变量,识别值的状态。

=================================================================

select * from emp where deptno = 10; --查询出3条记录

eg: insert into emp10 seleect * from emp where depton=10;

语句级触发器:针对是表,针对的是emp10表,尽管插入了3条数据,但是语句级触发器只操作了一次。

行级触发器:   针对是行,行级触发器会被调用三次。

=================================================================

--应用场景一、实施复杂的安全性检查

--禁止在非工作时间插入新员工

/*

周末:to_char(sysdate,‘day‘) in (‘星期六‘,‘星期日‘)

上班前,下班后:to_number(to_char(sysdate,‘hh24‘)) not between 9 and 18

raise:抛出数据库错误

*/

create or replace trigger securityemp

befor insert  --在插入操作之前出发

on emp    --针对emp这张表

--declare      由于程序中不需要使用变量所以可以不用写declare

begin

  if to_char(sysdate,‘day‘) in (‘星期六‘,‘星期日‘) or

  to_number(to_char(sysdate,‘hh24‘)) not between 9 and 18

  --禁止insert员工,可以通过抛出例外

  raise_application_error(-20001,‘禁止在非工作时间插入新员工‘);  --抛出一个应用程序错误,这个函数接收两个参数,第一参数是错误代码(在oracle程序中自己定义的错误代码必须在

                                   --区间(-20000,-20999)),第二个是错误信息

  end if;

end;

/

=================================================================

--应用场景二,数据的确认

--涨后的薪水不能少于涨前的薪水

/*

1、:old和:new 代表的是同一条记录

2、:old 表示操作该行之前,这一行的值

   :new 表示操作该行之后,这一行的值

  ||链接符

*/

create or replace triggger checksalary

before update

on emp

for each row

begin

  --if 涨后的薪水 < 涨前的薪水 then

  if:new.sal < :old.sal then

  raise_application_error(-20002,‘涨后的薪水不能少于涨前的薪水.涨后的薪水:‘||:new.sal||‘涨前的薪水:‘||:old.sal||);

  end if;

end;

/

================================================================

/*

应用场景三: 数据库审计-->基于值的审计功能

给员工涨工资,当涨后的薪水超过6000块钱的时候,审计该员工的信息

*/

--创建表,用于保存审计信息

create table audit_info

(

information varchar2(200)

);

create or replace trigger do_audit_emp_salary

after update

on emp

for each row

begin

  --当涨后的薪水>6000,插入审计信息

  if :new.sal>6000 then

  insert into audit_info values(:new.empno||‘     ‘||:new.ename||‘     ‘||:new.sal);

  end if;

end;

/

================================================================

/*

应用场景四、数据的备份和同步

当给员工涨完工资后 ,自动备份新的员工工资到备份表中

*/

--创建员工表的备份

create table emp_back as select * from emp;

create or replace trigger sync_salary

after update

on emp

for each row

begin

  --当主表更新后,自动更新备份表

  update emp_back set sal=:new.sal where empno=:new.empno;

end;

/

时间: 2024-10-07 01:09:16

oracle_触发器的相关文章

Oracle_角色_权限详细说明

一.Oracle内置角色connect与resource的权限 grant connect,resource to user; CONNECT角色: --是授予最终用户的典型权利,最基本的 ALTER SESSION --修改会话 CREATE CLUSTER --建立聚簇 CREATE DATABASE LINK --建立数据库链接 CREATE SEQUENCE --建立序列 CREATE SESSION --建立会话 CREATE SYNONYM --建立同义词 CREATE VIEW -

Oracle数据库——触发器的创建与应用

一.涉及内容 1.理解触发器的概念.作用和类型. 2.练习触发器的创建和使用. 二.具体操作 (实验) 1.利用触发器对在scott.emp表上执行的DML操作进行安全性检查,只有scott用户登录数据库后才能向该表中执行DML操作.(第1题中,user是系统函数,返回当前用户.字符串中使用两个单引号表示一个单引号.) 要求:分别以system用户和scott用户对emp 表执行DML操作,试验触发器的运行效果. (1)在scott用户下创建触发器 语句: create or replace t

Mysql中的触发器

阅读目录 什么是触发器 特点及作用 例子:创建触发器,记录表的增.删.改操作记录 弊端 什么是触发器 简单的说,就是一张表发生了某件事(插入.删除.更新操作),然后自动触发了预先编写好的若干条SQL语句的执行: 特点及作用 特点:触发事件的操作和触发器里的SQL语句是一个事务操作,具有原子性,要么全部执行,要么都不执行: 作用:保证数据的完整性,起到约束的作用: 例子:创建触发器,记录表的增.删.改操作记录 接下来将创建user和user_history表,以及三个触发器tri_insert_u

oracle(sql)基础篇系列(五)&mdash;&mdash;PLSQL、游标、存储过程、触发器

  PL/SQL PL/SQL 简介 每一种数据库都有这样的一种语言,PL/SQL 是在Oracle里面的一种编程语言,在Oracle内部使用的编程语言.我们知道SQL语言是没有分支和循环的,而PL语言是为了补充SQL语言的,是带有了分支和循环的语言. PL/SQL 语法 基本数据类型声明 declare v_name varchar2(20); v_temp number(1); v_count binary_integer := 0; v_sal number(7,2) := 4000.00

information_schema系列五(表,触发器,视图,存储过程和函数)

这个系列的文章主要是为了能够让自己了解MySQL5.7的一些系统表,统一做一下备注和使用,也希望分享出来让大家能够有一点点的受益. 1:TABLES TABLES这张表毫无疑问了,就是记录的数据库中表的信息,其中包括系统数据库和用户创建的数据库.而TABLESPACES 却是标注的活跃表空间. 看一下TABLES 的记录关于TEST1表: 其实我们通过show table status like 'test1'\G;可以看到相同的信息. TABLE_TYPE这列有两种类型,分别是BASE TAB

触发器和存储过程

触发器和存储过程   1.触发器   在进行dml操作的时候(insert,update,delete),可以对事件进行监听和响应,这种机制在数据库中叫做触发器.   触发器与永久性表关联,只能建在永久性表上面,不能是temporary表或view,且只有insert,update,delete三种事件.   mysql -u root -paixocm   show triggers;   show triggers\G;mysql> delimiter // ====改结束符   自动在内存

oracle 触发器

触发器--启动触发器alter trigger schema_trigger enable;--禁用触发器alter trigger schema_trigger disable;--删除触发器DROP TRIGGER COMPONT_GIS_TEM; 这个触发器是为了增加部件时,同步更新部件的缓存表,缓存表是为了在拿gis数据时,不用再联表查询街道.社区.大类的名称了缓存表中的sequence是  COMPONT_GIS_TEM_SEQ加入触发器的语句是CREATE OR REPLACE TR

Oracle_事务控制语句

事务是对数据库操作的逻辑单位,在一个事务中可以包含一条或多条DML (数据操纵语言).DDL (数据定义语言)和DCL (数据控制语言)语句,这些语句组成一个逻辑整体. 事务的执行只有两种结果:要么全部执行,把数据库带入一个新的状态,要么全部不执行,对数据库不做任何修改.对事务的操作有两个:提交( COMMIT )和回滚( ROLLBACK ). 提交事务时,对数据库所做的修改便永久写入数据库.回滚事务时,对数据库所做的修改全部撤销,数据库恢复到操作前的状态.事务可用于操作数据库的任何场合,包括

mysql触发器

这两天写项目,有个要求是记录用户登录登出操作,把这些操作写到日志表里去,我觉得这个功能用MySQL的触发器来写,更方便一些,所以在这整理了一下这一过程. 在这里,我就不把项目的所以代码都粘贴过来了,项目用的是hibernate,这里我创建两个简单的表来演示一下这个过程. 1:登录表,记录用户的账号,密码以及在线状态,0表示不在线,1表示在线.对status进行默认约束,默认值就是0. create table login( id int not null primary key auto_inc