精华内容
下载资源
问答
  • oracle update触发器

    千次阅读 2018-06-14 09:30:26
    语法create [or replace] tigger 触发器名 触发时间 触发事件on 表名[for each row]begin pl/sql语句end 其中:触发器名:触发器对象的名称。由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的...

    语法

    create [ or replace ] tigger 触发器名 触发时间 触发事件
    on 表名
    [ for each row]
    begin
      pl/sql语句
    end

      

    其中:

    触发器名:触发器对象的名称。由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。
    触发时间:指明触发器何时执行,该值可取:
    before:表示在数据库动作之前触发器执行;
    after:表示在数据库动作之后触发器执行。
    触发事件:指明哪些数据库动作会触发此触发器:
    insert:数据库插入会触发此触发器;
    update:数据库修改会触发此触发器;
    delete:数据库删除会触发此触发器。
    表 名:数据库触发器所在的表。
    for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。

    触发器能实现如下功能:

    功能

    1、 允许/限制对表的修改
    2、 自动生成派生列,比如自增字段
    3、 强制数据一致性
    4、 提供审计和日志记录
    5、 防止无效的事务处理
    6、 启用复杂的业务逻辑

    例子

    create or replace trigger update_ejjd_name after update
    on t_sys_organization
    for each row
    begin
     IF :new.org_name!=:old.org_name THEN
       update T_NEWS_ITEM i set i.fname=:new.org_name where i.FNUMBER=:old.org_short_code;
     END IF;

    end;



    展开全文
  • Oracle Update触发器

    在项目中使用到Oracle数据库的Update触发器,先记录下来方便以后查阅。

    预备知识和格式以后再编辑吧,先把内容贴出来。


    CREATE OR REPLACE TRIGGER demo_trigger
    
    AFTER UPDATE ON tb_goods
    
    REFERENCING NEW AS NEW OLD AS OLD
    
    FOR EACH ROW
    
    WHEN( NEW.AMOUNT = 10  OR NEW.AMOUNT = 0)
    
    DECLARE
     MSG VARCHAR2(100);
     RECEIVER NUMBER;
     SENDER NUMBER;
     goUrl VARCHAR2(200);
     STATE VARCHAR2(2);
    -- Params VARCHAR2(30);
    --Pvalue NUMBER;
    
    BEGIN
     
         
         MSG :=  '您的商品' || :NEW.GOODSNAME;
         SENDER := 0;
         STATE := '0';
         goUrl := 'goodsAction_query.action';
         
         SELECT S.USER_ID INTO RECEIVER FROM TB_SHOP S WHERE S.SHOP_ID = :NEW.SHOPID;
         
         IF :NEW.AMOUNT = 10  THEN
               
           MSG := MSG || '库存数量不足10件,请及时补货!';
           INSERT INTO TB_MESSAGE VALUES (tb_message_seq.nextval ,MSG ,SENDER ,RECEIVER,STATE,goUrl,'' ,'');
    
    
         ELSIF :NEW.AMOUNT = 0 THEN
           
           --NEW.STATE := '1';
         
           MSG := MSG || '库存数量已为0件,已下架!';
           
           INSERT INTO TB_MESSAGE VALUES (tb_message_seq.nextval ,MSG ,SENDER ,RECEIVER,STATE,goUrl,'' ,'');  
           --更新状态为 : 下架
           UPDATE tb_goods g set g.STATE = 1 WHERE GOODSID = :NEW.GOODSID;
          
    
         END IF;
    
    END;
    


    展开全文
  • 前言在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块。触发器类型触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器...

    前言

    在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块。

    触发器类型

    触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。所以运行触发器就叫触发或点火(firing)。ORACLE事件指的是对数据库的表进行的INSERT、UPDATE及DELETE操作或对视图进行类似的操作。ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。所以触发器常用来完成由数据库的完整性约束难以完成的复杂业务规则的约束,或用来监视对数据库的各种操作,实现审计的功能。

    开发中肯定会用到Oracle的触发器,本文进行详细讲解。

    这里实例中用到的主要是Oracle中scott用户下的emp以及dept表,数据如下

    1ca4e051d8e191711ca6c7a44c666518.png

    f7890eafc643ade7cb629023b5af2bd8.png

    一、触发器概念

    1、概念:

    触发器的本质是一个存储过程,顾名思义发生特定事件时Oracle会执行触发器中的代码。细分它的组成可以分为3个部分:第一部分在什么条件下触发器会执行,即触发器被触发的事件。第二部分在什么时间点执行触发器即触发器的发生事件例如before,after。第三部分触发器自身所要做的事情,就是触发器被触发以后具体想表达的事件,在begin和end之间的sql。

    二、触发器的分类:

    1、ddl触发器:即执行ddl操作后所触发的事件。

    常用的ddl操作有:grant(授权),revoke(撤销授权),create(创建),drop(删除),alter(修改),comment(注释),audit(审核),rename(重命名)在进行具体实例以前先来讲解另一个概念:oracle中的user和schema:

    user:oracle中的用户,拥有数据库的对象以及对数据库对象增删改查的权限。schema:该用户下所有数据库对象的集合Collection.类似于生活中房子schema和房子的拥有者user之间的关系,你是一个用户user你可以通过alter session查看别人的房子,但是你是否可以改变房子中的家具,要看这个房子的拥有者是否grant你这个权限,除非你是所有房子的最高权限人dba。

    ddl Example:禁止scott用户的所有ddl操作

    CREATE OR REPLACE TRIGGER scott_trigger

    BEFORE DDL

    ON SCHEMA

    BEGIN

    RAISE_APPLICATION_ERROR(-20008,'禁止scott用户的所有ddl操作');

    END;

    create sequence myseq;

    b1bce5644915dabf8f557bb7752d832c.png

    这里看到在创建触发器以后如果仍然使用ddl操作,便会报错。

    2、dml触发器:基于dml操作的触发器,细分又可以分为行触发器和语句触发器。

    A、语句触发器:dml操作可能会影响很多行,主要用于对数据的安全保护。

    Example:禁止在周四,周五修改emp表数据

    CREATE OR REPLACE TRIGGER emp_trigger

    BEFORE UPDATE OR DELETE OR INSERT

    ON emp

    BEGIN

    IF to_char(sysdate,'day') IN ('星期四','星期五') THEN

    RAISE_APPLICATION_ERROR(-20008,'不允许在周四周五修改emp表');

    END IF;

    END;

    update emp set sal=800;

    b1e4632a4e6618a2680bf24381175180.png

    这里建立触发器以后,当你想改变所有人的工资时就会出触发器的错误,所有人的工资即表示会影响很多行。

    B、行级触发器:针对需要操作的那一行,有关键词:for each row,用来

    (1)实现数据的审计功能:

    Example:做一个记录删除员工信息的表记录被删除员工的信息

    这里为了不改变oracle中emp表的数据,新建一个emp_new表

    create table emp_new

    as

    select * from emp;

    create table emp_audit(name varchar2(10),delete_time Date);

    CREATE OR REPLACE TRIGGER delete_trigger

    AFTER DELETE ON emp_new

    FOR EACH ROW

    BEGIN

    INSERT INTO emp_audit values(:old.ename,sysdate);

    END;

    delete from emp_new where empno='7499';

    select * from emp_audit;

    fe8d69a6e2d4e29b1e8a563d86336219.png

    这里可以看到在创建触发器时,用到了for each row关键词,:old.***用来表示更改以前的表中的数据,:new.***用来表示更改以后的数据,在删除数据以后在日志表就有对应的记录。

    (2)实现数据完整性:

    Example:要求员工涨工资后,不能低于原来的工资,所涨工资也不能高于原来的50%。

    这里为了不改变oracle中emp表的数据,新建一个emp_new表

    create table emp_new

    as

    select * from emp;

    CREATE OR REPLACE TRIGGER emp_trigger

    BEFORE UPDATE OF sal ON emp_new

    FOR EACH ROW

    WHEN (new.sal1.5*old.sal)

    BEGIN

    RAISE_APPLICATION_ERROR(-20008,'工资只增不降,且涨幅不可大于50%');

    END;

    update emp_new set sal = 1.6*sal where empno='7788';

    2d9ed1587151fcbf142d2a65d887517c.png

    这里可以看到当改变数据时会触发触发器错误,对表中某一个字段的修改用UPDATE OF即可,另外如果new和old在PLSQL块的外部即BEGIN外面不可以加冒号。

    (3)参照完整性:

    Example:主要用于级联更新,如更新dept表中的deptno时,emp表的deptno也更新。

    这里仍然新建2个表分别和emp表dept表的数据相同。

    create table emp_new

    as

    select * from emp;

    create table dept_new

    as

    select * from dept;

    CREATE OR REPLACE TRIGGER cascade_trigger

    AFTER UPDATE OF deptno ON dept_new

    FOR EACH ROW

    BEGIN

    UPDATE emp_new SET deptno=:new.deptno WHERE deptno=:old.deptno;

    END;

    update dept_new set deptno=15 where deptno=20;

    select * from dept_new;

    1d7cafbb5c64ec1e2a922ca4ec2881dc.png

    select * from emp_new;

    a004efc0ca866ad580acc4bb6663ac14.png

    这里参照完整新指具有主从关系的多个表,当更新主表主键时需要更新从表的相关数据。

    3、替代触发器:

    这里先讲另一个概念:带有with check option的视图:

    如果视图的定义包括条件(如where子句)并且任何应用于该视图的INSERT或UPDATE语句都应包括该条件,则必须使用WITH CHECK OPTION定义该视图。

    Example:

    CREATE VIEW emp_view

    (ename,empno)

    AS SELECT ename,empno FROM emp

    WHERE deptno=20

    WITH CHECK OPTION;

    这里有个条件部门号为20,则任何修改这个视图的语句都必须针对的是20号部门的员工。

    继续替代触发器的概念:关键字insteadof,主要针对一些复杂的视图,因为级联表所产生的视图不可以使用update,insert,delete等关键字,没有before,after等关键字,并且不可以建立在with check option选项的视图上,比如新建一个emp表和dept表的级联视图,则不可以向其中添加数据,现在通过触发器解决:

    Example:

    仍然新建2个表分别和emp表dept表的数据相同。

    CREATE TABLE emp_new

    AS

    SELECT * FROM emp;

    CREATE TABLE dept_new

    AS

    SELECT * FROM dept;

    CREATE VIEW emp_dept

    AS

    SELECT d.deptno,d.dname,e.empno,e.ename

    FROM dept_new d,emp_new e

    WHERE d.deptno=e.deptno;

    这里scott用户需要先通过sysdba授权才能建立视图:

    grant create view to scott;

    CREATE OR REPLACE TRIGGER insteadof_trigger

    INSTEAD OF INSERT ON emp_dept

    FOR EACH ROW

    DECLARE

    v_temp INT;

    BEGIN

    SELECT COUNT(*) INTO v_temp FROM dept_new WHERE deptno=:new.deptno;

    IF v_temp=0 THEN

    INSERT INTO dept_new(deptno,dname) VALUES(:new.deptno,:new.dname);

    END IF;

    SELECT COUNT(*) INTO v_temp FROM emp_new WHERE empno=:new.empno;

    IF v_temp=0 THEN

    INSERT INTO emp_new(deptno,empno,ename) VALUES(:new.deptno,:new.empno,:new.ename);

    END IF;

    END;

    INSERT INTO emp_dept values(15,'HUMANRESOURCE',7999,'LEAF');

    select * from emp_new;

    18eaf5df8383cf8dd959408f92ab9c9c.png

    select * from dept_new;

    9931b2f4156e53757f021aac89cce060.png

    这里触发器中当对视图进行insert时,会对相应的emp_new 和dept_new进行修改,也就做到了对复杂视图的修改。

    4、系统触发器:顾名思义,由系统触发器所触发的事件,常用的系统事件startup,shutdown,db_roll_change,server error等。

    Example:记录启动数据库时的事件以及时间。

    此处因为是系统触发器,所以需要用sysdba的权限登陆。

    CREATE TABLE event_table(event VARCHAR2(50),event_time DATE);

    CREATE OR REPLACE TRIGGER event_trigger

    AFTER STARTUP ON DATABASE

    BEGIN

    INSERT INTO event_table VALUES(ora_sysevent,sysdate);

    END;

    afa55a2a30b06fc039709d68878078f7.png

    select * from event_table;

    85f237b095c7d9a5484c4d33c2cf676c.png

    三、触发器的综合实例

    Example:做一个日志用来记录scott用户的一些操作:

    首先在sysdba权限下建立日志表,序列,触发器:

    CREATE TABLE object_log(

    logid NUMBER CONSTRAINT pk_logid PRIMARY KEY,

    operatedate DATE NOT NULL,

    objecttype VARCHAR2(50) NOT NULL,

    objectowner VARCHAR2(50) NOT NULL

    );

    CREATE SEQUENCE obj_log_seq;

    CREATE OR REPLACE TRIGGER object_trigger

    AFTER CREATE OR DROP OR ALTER ON DATABASE

    BEGIN

    INSERT INTO object_log VALUES(obj_log_seq.nextval,sysdate,ora_dict_obj_type,ora_dict_obj_owner);

    END;

    在scott用户下随便创建个东西:

    CREATE SEQUENCE my_seq;

    回到sysdba权限下查看日志表中是否有对应的记录:

    SELECT * FROM object_log;

    e7c54d61f39725a82b8f0a13060120ce.png

    发现有数据,说明一个日志表成功做好,监视一些用户操作的触发器就做好了。至此,触发器全部说明完毕,不足之处还请评论说明,谢谢。

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

    展开全文
  • /****** Object: Trigger [dbo].[order_update_tigger] Script Date: 08/23/2019 15:16:45 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- =================================...
    USE [FenHotel]
    GO
    /****** Object:  Trigger [dbo].[order_update_tigger]    Script Date: 08/23/2019 15:16:45 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:		<Author,,huQk>
    -- Create date: <Create Date,,>
    -- Description:	<Description,,>
    -- =============================================
    ALTER TRIGGER [dbo].[order_update_tigger]
       ON [dbo].[T_HotelOrder]
       AFTER UPDATE
    AS 
    BEGIN
    
        declare @order_state int;
    	declare @order_id varchar(20);
    
    			select	@order_id=order_id,@order_state=order_state from inserted;
    		
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	--SET NOCOUNT ON;
    SET XACT_ABORT on UPDATE OPENQUERY (ORACLE,'SELECT ORDER_ID,ORDER_STATE FROM FN_TICKET.HT_ORDER') SET ORDER_STATE=@order_state where ORDER_ID=@order_id
       
    END
    
    展开全文
  • ORACLE 添加 表 update 触发器

    千次阅读 2016-12-14 19:10:35
    场景: 当更新组织表里面某个字段的时候,需要触发改动其他...则进入到相应的用户下面去,然后执行下面的授权语句,我这边是只需要授权update的权限。  grant update on t_bc_housepower to basedb; --basedb 是用户
  • ORACLE事件指的是对数据库的表进行的INSERT、UPDATE及DELETE操作或对视图进行类似的操作。ORACLE触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。所以触发器常用来完成由数据库的完整性约束难以完成的...
  • Oracle创建触发器

    2017-09-23 15:03:43
    Oracle创建触发器,说明很清晰明了
  • create or replace trigger TIG_USER ...before update on "USER" for each row begin select sysdate into :new.update_date from dual; exception when others then end; 上面的代码是数据更...
  • Oracle触发器

    2017-07-14 15:09:20
    Oracle触发器说明:oracle触发器,对指定表进行增删改操作,触发逻辑操作。SQL> create or replace trigger agreement_trigger 2 after update or insert or delete on base_agreement_template_test 3 for each...
  • 1.DML触发器由对表的INSERT,DELETE,UPDATE激发CREATE OR REPLACE TRIGGER trigger_nameAFTER -- TIMING :BEFORE OR AFTERDELETE OR INSERT OR UPDATE ON table_name -- STATEMENT--REFERE...
  • ORACLE创建触发器

    2021-10-20 15:09:44
    DELETE|INSERT|UPDATE触发器响应的DML事件。REFERENCING,为OLD、NEW、PARENT伪记录指定 别名,FOR EACH ROW,指定为行级简单DML触发器,即触发 语句每影响一行数据,触发器执行一次。默认为语句级简单 DML触发器...
  • Oracle数据库触发器

    2019-09-11 15:36:27
    作用:每当一个特定的数据操作语句(insert,update,delete)在特定的表上触发时,Oracle自动的执行触发器中定义的语句序列;(注:select语句没有触发器) 下面我们先来写第一个触发器程序:每当成功插入新员工后,...
  • oracle触发器

    2014-06-03 14:34:00
    2, update触发器;3, delete触发器;触发器的组成部分: 触发器的声明,指定触发器定时,事件,表名以类型 触发器的执行,PL/SQL块或对过程的调用 触发器的限制条件,通过where子句实现类型: ...
  • CREATE OR REPLACE TRIGGER TRG_PRODUCTLIST_UPDATEAFTER UPDATE OF ISPUBLISHON PRODUCTLISTFOR EACH ROW declare ProvideNo ProvideInfo.ProvideNo%type; InfoTitle ProvideInfo.InfoTitle%type; FarmPr
  • Oracle数据库触发器是存储于数据库的命名PL/SQL语句块,当触发事件发生时他们会隐含的执行,执行触发器的活动被称为触发触发器。特定用户在特定模式下,或者任何用户执行的ddl语句(如create或者alter),这种触发器...
  • Oracle-触发器

    2019-12-29 17:37:00
    Oracle-触发器 分类 语句级触发器 : 不论影响多少行,都只出发一次 行级触发器 : 影响多少行,就出发多少次 :old 原记录 :new 新纪录 实例一–新加入数据后,输出一句话 --新员工入职后输出一句话 create ...
  • oracle笔记触发器

    2018-11-02 18:50:18
    /* pl/sql触发器知识点 ...语句级触发器: 一个 update/delete/insert 语句只使触发器执行一次 */ -- --一个helloworld级别的触发器 CREATE OR REPLACE TRIGGER HELLO_TRIGGER AFTER UPDATE ON EMPLOYEES...
  • 目测, 你是在用 SQL Server 数据库的语法, 在 Oracle 上面写触发器啊......CREATE TABLE a ( objcode INT, objstate INT);CREATE TABLE b ( objcode INT, objstate INT);INSERT INTO a VALUES( 1, 100);INSERT ...
  • Oracle触发器

    2018-05-23 14:51:31
    Oracle中允许在对表进行insert、update和delete操作时隐式的执行所定义的过程,这些过程称为数据库的触发器。 触发器一般用于: 1、自动生成导出的列值; 2、防止无效的事务; 4、实施更复杂的安全性检查; 5...
  • oracle触发器

    2018-01-03 11:38:04
    1 oracle触发器是当进行操作时触发事情,进行处理。例如进行对数据表进行插入、更新和删除时进行触发事情处理。 定义触发器的是:create or replace trigger xxx  before|after insert |update|delete  on ...
  • oracle 修改触发器

    2020-04-21 16:23:24
    1.创建表 create table depart (id int, status int, aacount varchar2(1)); insert into departvalues (1,30,'N'); ...2.创建修改触发器 ...create or replace trigger update_depart before insert or upd...
  • ORACLE触发器详解

    万次阅读 多人点赞 2012-09-27 10:00:56
    当在触发器中包含多个触发事件(INSERT、UPDATE、DELETE)的组合时,为了分别针对不同的事件进行不同的处理,需要使用ORACLE提供的如下条件谓词。 1)。 INSERTING: 当触发事件是INSERT时,取值为TRUE,否则为...
  • Oracle触发器

    2019-05-05 16:57:33
    Oracle数据库中,触发器的本质就是PL/SQL代码块。触发器按照触发事件类型和对象的不同,可以分为"语句触发器"、“行触发器”、“instead of 触发器”、“系统事件触发器"和"用户事件触发器”。其中"语句触发器"、...
  • oracle trigger触发器

    千次阅读 2018-04-10 11:48:11
    update on BY_GOODS for each row begin if updating ( 'STATE' ) then insert into BY_TRIGGER_LOG (trig_name,trig_time,trig_table,trig_column,trig_value,trig_id) values ( '...
  • 每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列。解释:首先,它也是一段plsql程序。然后,它是来触发与表数据操作相关的(insert,update,delete)...
  • 1、触发器使用场景 复杂的安全性检查 数据确认 ...5、触发器的作用:每当一个特定的数据操作语句(insert、update、delete)在指定的表上发出的时候,oracle自动的执行触发器中定义的语句序列。6、第一个触发器:完成...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,543
精华内容 12,217
关键字:

oracleupdate触发器