广告
返回顶部
首页 > 资讯 > 数据库 >Oracle中触发器(2)
  • 894
分享到

Oracle中触发器(2)

2024-04-02 19:04:59 894人浏览 泡泡鱼
摘要

   上一篇对触发器的一些基本知识有了了解,在这一篇操作进行验证before触发器[oracle@test ~]$ sqlplus / as sysdbaSQL> cre

   上一篇对触发器的一些基本知识有了了解,在这一篇操作进行验证

before触发器

[oracle@test ~]$ sqlplus / as sysdba

SQL> create user trigger_test identified by 123456 ;
SQL> grant create session to trigger_test ;
SQL> grant create table to trigger_test ;
SQL> grant dba to trigger_test ;
SQL> grant resource to trigger_test ;
SQL> grant create sequence to trigger_test ;

[oracle@test ~]$ sqlplus trigger_test/123456

创建测试表student

SQL> create table student(STUDENT_ID NUMBER(8),name varchar2(15),CREATED_BY VARCHAR2(30) not null,CREATED_DATE DATE not null,MODIFIED_BY VARCHAR2(30) not null,MODIFIED_DATE DATE not null)

创建序列student_id_seq

create sequence student_id_seq
minvalue 1
maxvalue 9999999999999999999999999999
start with 100
increment by 1;
SQL> select * from student ;

no rows selected


SQL> select * from cat ;

TABLE_NAME		       TABLE_TYPE
------------------------------ -----------
STUDENT 		       TABLE
STUDENT_ID_SEQ		       SEQUENCE
create or replace trigger student_before_insert
before insert on student
for each row 
declare
  v_student_id student.student_id%type ;
begin
  select student_id_seq.nextval
  into v_student_id
  from dual ;
  
  :new.student_id := v_student_id ;
  :new.created_by := user ;
  :new.created_date := sysdate ;
  :new.modified_by := user ;
  :new.modified_date := sysdate ;
  
end;
SQL> insert into student (name) values ('mjt');

SQL> commit ;

SQL> select * from student ;

STUDENT_ID NAME 	   CREATED_BY			  CREATED_DATE
---------- --------------- ------------------------------ -------------------
MODIFIED_BY		       MODIFIED_DATE
------------------------------ -------------------
       100 mjt		   TRIGGER_TEST 		  2015-07-29 20:51:19
TRIGGER_TEST		       2015-07-29 20:51:19

SQL> insert into student (name) values ('cxq') ;

1 row created.

SQL> select * from student ;

STUDENT_ID NAME 	   CREATED_BY			  CREATED_DATE
---------- --------------- ------------------------------ -------------------
MODIFIED_BY		       MODIFIED_DATE
------------------------------ -------------------
       100 mjt		   TRIGGER_TEST 		  2015-07-29 20:51:19
TRIGGER_TEST		       2015-07-29 20:51:19

       101 cxq		   TRIGGER_TEST 		  2015-07-29 21:00:54
TRIGGER_TEST		       2015-07-29 21:00:54

after触发器

SQL> create table record(table_name varchar2(30),transaction_name varchar2(10),transaction_user varchar2(30),transaction_date date);

这个表被用来记录数据库中不同表的信息,如,可以记录谁从student表中删除或者更新数据,以及记录时间。

下面的触发器针对对student表的更新或者删除操作,在此之后进行触发

create or replace trigger student_aud
  after update or delete on student
declare
  v_type varchar2(10);
begin
  if updating then
    v_type := 'UPDATE';
  
  elsif deleting then
    v_type := 'DELETE';
  end if;

  update trigger_test.record
     set transaction_user = user, 
     transaction_date = sysdate
   where table_name = 'student'
     and transaction_name = v_type;

  if sql%notfound then
    insert into trigger_test.record values ('student', v_type, user, sysdate);
  end if;

end;
SQL> select * from record ;

no rows selected

SQL> select * from student ;

STUDENT_ID NAME 	   CREATED_BY			  CREATED_DATE
---------- --------------- ------------------------------ -------------------
MODIFIED_BY		       MODIFIED_DATE
------------------------------ -------------------
       100 mjt		   TRIGGER_TEST 		  2015-07-29 20:51:19
TRIGGER_TEST		       2015-07-29 20:51:19

       101 cxq		   TRIGGER_TEST 		  2015-07-29 21:00:54
TRIGGER_TEST		       2015-07-29 21:00:54


SQL> update student set name = 'somebody' where name = 'mjt' ;

1 row updated.

SQL> commit ;

Commit complete.

SQL> select * from student ;

STUDENT_ID NAME 	   CREATED_BY			  CREATED_DATE
---------- --------------- ------------------------------ -------------------
MODIFIED_BY		       MODIFIED_DATE
------------------------------ -------------------
       100 somebody	   TRIGGER_TEST 		  2015-07-29 20:51:19
TRIGGER_TEST		       2015-07-29 20:51:19

       101 cxq		   TRIGGER_TEST 		  2015-07-29 21:00:54
TRIGGER_TEST		       2015-07-29 21:00:54

SQL> select * from record ;

TABLE_NAME		       TRANSACTIO TRANSACTION_USER
------------------------------ ---------- ------------------------------
TRANSACTION_DATE
-------------------
student 		       UPDATE	  TRIGGER_TEST
2015-07-29 21:50:46


SQL> delete student where name = 'somebody' ;

1 row deleted.

SQL> commit ;

Commit complete.

SQL> select * from student ;

STUDENT_ID NAME 	   CREATED_BY			  CREATED_DATE
---------- --------------- ------------------------------ -------------------
MODIFIED_BY		       MODIFIED_DATE
------------------------------ -------------------
       101 cxq		   TRIGGER_TEST 		  2015-07-29 21:00:54
TRIGGER_TEST		       2015-07-29 21:00:54

SQL> select * from record ;

TABLE_NAME		       TRANSACTIO TRANSACTION_USER
------------------------------ ---------- ------------------------------
TRANSACTION_DATE
-------------------
student 		       UPDATE	  TRIGGER_TEST
2015-07-29 21:50:46

student 		       DELETE	  TRIGGER_TEST
2015-07-29 21:56:08


SQL> alter trigger student_aud disable ;

Trigger altered.

SQL> update student set name = 'mjt' where name = 'cxq';

1 row updated.

SQL> commit ;

Commit complete.

SQL> select * from student ;

STUDENT_ID NAME 	   CREATED_BY			  CREATED_DATE
---------- --------------- ------------------------------ -------------------
MODIFIED_BY		       MODIFIED_DATE
------------------------------ -------------------
       101 mjt		   TRIGGER_TEST 		  2015-07-29 21:00:54
TRIGGER_TEST		       2015-07-29 21:00:54

SQL> select * from record ;

TABLE_NAME		       TRANSACTIO TRANSACTION_USER
------------------------------ ---------- ------------------------------
TRANSACTION_DATE
-------------------
student 		       UPDATE	  TRIGGER_TEST
2015-07-29 21:50:46

student 		       DELETE	  TRIGGER_TEST
2015-07-29 21:56:08

禁用触发器之后,在student表上的update操作不再触发产生记录到record表

对应启用

SQL> alter trigger student_aud enable ;

Trigger altered.

3.自治事务


自治事务是由其他事务(通常被称为主事务)发起的独立事务,自治事务也许会执行多个dml语句,并且提交或者回滚,而不会提交或者回滚主事务执行的dml语句。


假如希望即使主事务失败,仍旧能够记录审计数据,这种情况下,主事务是面向

表的update或者delete,需要定义可以独立于主事务进行提交的自治事务。


定义主事务,需要使用autonomous_transaction编译指令在语句块的声明部分

declare 
pragma autonomous_transaction

commit ;

create or replace trigger student_aud
  after update or delete on student  
declare
  v_type varchar2(10);
  pragma autonomous_transaction ;
begin
  if updating then
    v_type := 'UPDATE';
  
  elsif deleting then
    v_type := 'DELETE';
  end if;

  update trigger_test.record
     set transaction_user = user, 
     transaction_date = sysdate
   where table_name = 'student'
     and transaction_name = v_type;

  if sql%notfound then
    insert into trigger_test.record values ('student', v_type, user, sysdate);
  end if;
  commit ;
end;

如果当前更新或者删除表student中的内容,无论成功或者失败,都会在record表中记录当前的操作。不足的是,record表中最多只能记录两条数据,只是当前最新操作的时间以及操作者。

您可能感兴趣的文档:

--结束END--

本文标题: Oracle中触发器(2)

本文链接: https://www.lsjlt.com/news/45573.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Oracle中触发器(2)
       上一篇对触发器的一些基本知识有了了解,在这一篇操作进行验证before触发器[oracle@test ~]$ sqlplus / as sysdbaSQL> cre...
    99+
    2022-10-18
  • oracle 触发器
    -- Create table a  触发器create table T_AC_TEST(  ID     ...
    99+
    2022-10-18
  • SqlServer系列笔记——触发器2
    一、创建一个简单的触发器触发器是一种特殊的存储过程,类似于事件函数,SQL Server 允许为 INSERT、UPDATE、DELETE 创建触发器,即当在表中插入、更新、删除记录时,触发一个或一...
    99+
    2022-10-18
  • Oracle中的触发器trigger
    触发器是指被隐含执行的存储过程 一、创建DML触发器(before/after) 1、行触发器: 当一个DML操作影响DB中的多行时,对于其中复合触发条件的每行均触发一次(for e...
    99+
    2022-11-13
  • oracle触发器定时触发怎么配置
    在Oracle数据库中,可以使用触发器来定时触发某些操作。触发器可在以下情况下自动触发:在插入、更新或删除表中的数据时,或在满足某些...
    99+
    2023-08-09
    oracle
  • Oracle DML触发器和DDL触发器实例详解
    目录一、概念二、DML触发器2.1、语句触发器2.2、行级触发器2.3、DML触发器语法:2.4、触发器谓词:2.5、实例说明三、DDL 触发器3.1、DDL触发器语法3.2、DDL...
    99+
    2023-03-13
    oracle 触发器 oracle触发器语句 oracle创建触发器语句
  • Oracle DML触发器和DDL触发器实例详解
    目录一、概念二、DML触发器2.1、语句触发器2.2、行级触发器2.3、DML触发器语法:2.4、触发器谓词:2.5、实例说明三、DDL 触发器3.1、DDL触发器语法3.2、DDL 事件3.3、可用属性3.4、实例说明...
    99+
    2023-03-13
    oracle 触发器 oracle触发器语句 oracle创建触发器语句
  • Oracle DML触发器和DDL触发器怎么使用
    今天小编给大家分享一下Oracle DML触发器和DDL触发器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
    99+
    2023-07-05
  • Oracle 触发器详解(trigger)
    Oracle中的触发器是一种特殊的数据库对象,它是与表关联的一段PL/SQL代码,当特定的数据库操作发生时,触发器会自动执行这段代码...
    99+
    2023-09-20
    Oracle
  • Oracle系列:(30)触发器
    什么是触发器【Trigger】?不同的DML(select/update/delete/insert)操作,触发器能够进行一定的拦截,符合条件的操作方可操作基表;反之,不可操作基表。类似于Java...
    99+
    2022-10-18
  • Oracle 笔记(九)、触发器
    1、触发器一旦创建就会立刻生效,有时可能需要临时禁用触发器,最常见的原因就是涉及数据加载。ALTER TRIGGER trigger_name [ENABLE | DISABLE];  ...
    99+
    2022-10-18
  • oracle触发器是什么
    本篇文章给大家分享的是有关oracle触发器是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Oracle触发器是什么呢? 首先我们来了解一...
    99+
    2022-10-18
  • Oracle触发器trigger详解
    Oracle触发器(Trigger)是一种特殊的数据库对象,可以在数据库中的某个事件发生时自动执行一系列的操作。触发器通常与数据库表...
    99+
    2023-08-15
    oracle
  • 如何在Oracle中使用触发器
    如何在Oracle中使用触发器?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。触发器类型触发器在数据库里以独立的对象存储,它与存储过程和函数...
    99+
    2022-10-18
  • Oracle专题16之触发器
    1、触发器的概述 a、触发器是什么? 触发器是指存放在数据库中,并且被隐含执行的存储过程。 当发生特定事件时,Oracle会自动执行触发器的相应代码。 b、触发器的类型 DML触发器;DDL触发器;替代(...
    99+
    2022-10-18
  • Oracle触发器实例代码
    Oracle触发器,用于选单后修改选单的表的触发动作。 --备货检验选单后 回写备货状态 CREATE OR REPLACE TRIGGER tri_TobaccoStockINSERT after I...
    99+
    2022-10-18
  • oracle如何关闭触发器
    这篇文章主要介绍“oracle如何关闭触发器”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“oracle如何关闭触发器”文章能帮助大家解决问题。 ...
    99+
    2022-10-19
  • oracle触发器如何调试
    调试Oracle触发器可以使用以下几种方法:1. 使用DBMS_OUTPUT包:在触发器中插入调试信息,然后使用DBMS_OUTPU...
    99+
    2023-08-15
    oracle
  • Oracle行级触发器的使用
    oracle行级触发器的使用 1、创建触发器并使用dblink在插入时进行数据同步 异库异表同步 create or replace trigger triggerName --触发器名称 after insert on...
    99+
    2023-05-12
    Oracle行级触发器 Oracle触发器使用
  • Oracle 触发器trigger使用案例
    目录一、触发器定义二、触发器分类三、触发器功能四、触发器语法五、触发器使用案例案例1:向job1表中插入一条数据后输出 欢迎加入 语句案例2:数据校验,不允许星期二和星期四向emp1...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作