精华内容
下载资源
问答
  • 触发器(trigger)设置某个条件,如果SQL语句执行了该条件则触发某个或者某些固定的SQL 触发器:类型 1.DML触发器 2.替代触发器 3.系统事件触发器 对数据表进行DML语句操作(insert、update、delete)时所触发的...

    触发器:定义

        触发器(trigger)设置某个条件,如果SQL语句执行了该条件则触发某个或者某些固定的SQL

    触发器:类型

         1.DML触发器 2.替代触发器 3.系统事件触发器

    对数据表进行DML语句操作(insert、update、delete)时所触发的触发器,DML触发器有两种

        1.行级触发器 2.表级触发器;行级触发器会对数据库表中的受影响的每一行 触发一次触发器代码;语句级触发器则只触发一次,与语句所影响到的行数无关;触发器中使用before触发则在事件发生之前执行触发器代码;触发器中使用after触发器则在触发事件发生之后执行触发器代码;如果删除重建触发器中的某个表必须要检查触发器是否可用;触发器自动同步Demo请参考https://blog.51cto.com/zhanky/2355285

        1.DML行级触发器

    ----示例语法
    ----先了解这个语法它长什么样
    create or replace trigger modify_stu
    after update
    on CSDN_STUDENT
    for each row
    begin
        dbms_output.put_line(:old.classid||:old.classname);
    end;
    ----示例Demo(跟着示例执行一边就基本上就可以大概明白触发器怎么使用)
    ----新建SQL表
    create table CSDN_STUDENT   ---创建CSDN_STUDENT表
    (
      id        NUMBER(19), --id
      stu_no    VARCHAR2(20), --学号
      stu_name  VARCHAR2(32), --姓名
      stu_age   NUMBER,  --年龄
      stu_major VARCHAR2(32) --专业
    )
    
    create table CSDN_STU_LOG   ---创建CSDN_STU_LOG表,用于记录对CSDN_STUDENT表的操作日志
    (
      log_id     NUMBER,  --日志id
      log_action VARCHAR2(100),  --操作名称
      log_date   DATE,  --操作时间
      log_message   VARCHAR2(32) --
    )
    ----定义行级触发器
    ----modify_stu 触发器名字  
    ----insert update delete 条件
    ----for each row 表示行级触发器 
    ----:new 引用插入操作的某列值,如 :new.stu_name
    ----.:old 引用删除操作的某列值,如 :old.stu_name
    ----CSDN_STUDENT 关联的表
    ----update of stu_name 对应:new.stu_name和:old.stu_name人名
    ----如果不想显示人名或者其他信息将第二行和带:new和:old的改成字符'XXX'
    ------after insert or delete or update
    ------示例 insert into CSDN_STU_LOG values(1,'insert',sysdate,'XXX');
    
    create or replace trigger modify_stu
    after insert or delete or update of stu_name 
    on CSDN_STUDENT
    for each row
      begin 
        if inserting then
          insert into CSDN_STU_LOG values(1,'insert',sysdate,:new.stu_name);
        elsif deleting then
           insert into CSDN_STU_LOG values(2,'delete',sysdate,:old.stu_name);
        elsif updating then
          insert into CSDN_STU_LOG values(3,'update_old',sysdate,:old.stu_name);
          insert into CSDN_STU_LOG values(4,'update_new',sysdate,:new.stu_name);
         end if;
    end;

     ----触发器捕捉到SQL操作进行对应的处理 将日志保存至 CSDN_STU_LOG表中

    insert into CSDN_STUDENT values(1,'NO2','李四',21,'数学系');  --插入数据
    update CSDN_STUDENT set stu_age=19 where stu_name='李四';    --修改年龄
    delete CSDN_STUDENT where stu_name='李四';                   --删除数据

    2.DML表级触发器

    ----表级触发器不加 for each row
    create or replace trigger modify_stus
    before insert or update or delete on CSDN_STUDENT
    begin
       if deleting then
         raise_application_error(-20001,'该表不允许删除数据');
       elsif updating then
         raise_application_error(-20002,'该表不允许修改数据');
        elsif inserting then
         raise_application_error(-20003,'该表不允许插入数据');
        end if;
    end;

    再次进行添加、删除、更改操作会出现提示框禁止操作(在 IF 里面也可以SQL语句或者自定义的提示信息)

    insert into CSDN_STUDENT values(1,'NO2','李四',21,'数学系');  --插入数据
    update CSDN_STUDENT set stu_age=19 where stu_name='李四';    --修改年龄
    delete CSDN_STUDENT where stu_name='李四';                   --删除数据

    禁止删除表触发器特殊形况下使用可以提高安全性

    ----关键字drop 也可以替换成别的
    CREATE OR REPLACE TRIGGER CSDN_ddl_deny_lee
    BEFORE  drop OR truncate on database    
    begin
        raise_application_error(num => -20000,msg => '主机:' || SYS_CONTEXT('USERENV', 'HOST')||chr(13) || 'IP:' ||SYS_CONTEXT('USERENV', 'IP_ADDRESS')||'试图删除' || ora_dict_obj_name() || '表');
    end;

     

    展开全文
  • Oracle PL / SQL删除触发器示例

    千次阅读 2020-06-03 17:12:04
    本文向您展示如何使用DROP TRIGGER删除触发器。 -- delete a trigger DROP TRIGGER trigger_name; 注意 在DROP TRIGGER语句中,建议在触发器名称之前指定架构名称。 如果您未指定架构名称,则数据库将假定触发器...

    本文向您展示如何使用DROP TRIGGER删除触发器。

    -- delete  a trigger
    DROP TRIGGER trigger_name;

    注意
    在DROP TRIGGER语句中,建议在触发器名称之前指定架构名称。 如果您未指定架构名称,则数据库将假定触发器位于您自己的架构中。

    1.表+触发器

    1.1创建一个表和一个触发器。

    demo_data
    create table demo_data
    (
    id number(5) primary key,
    project_name varchar2(10)
    );
    trg_drop_example
    CREATE OR REPLACE TRIGGER trg_drop_example
    BEFORE
         UPDATE OR DELETE OR INSERT
    ON demo_data
      FOR EACH ROW 
    
    BEGIN
    
      dbms_output.put_line('trg_drop_example Trigger called.');
      
    END;

    2. DROP TRIGGER示例

    2.1检查触发状态:

    SELECT TRIGGER_NAME,STATUS FROM USER_TRIGGERS where upper(TRIGGER_NAME) = 'TRG_DROP_EXAMPLE';
    TRIGGER_NAME 状态
    TRG_DROP_EXAMPLE 已启用

    2.2删除触发器。

    DROP TRIGGER trg_drop_example;
    
    -- output
    -- Trigger trg_drop_example dropped.

    2.3再次检查状态。

    SELECT TRIGGER_NAME,STATUS FROM USER_TRIGGERS where upper(TRIGGER_NAME) = 'TRG_DROP_EXAMPLE';
    
    -- output
    -- no rows selected.

    参考文献

    1. Oracle – DROP触发器
    2. Oracle – PL / SQL触发器
    3. 检查触发状态

    翻译自: https://mkyong.com/oracle/oracle-plsql-delete-trigger-example/

    展开全文
  • 下面我给大家上一串代码,这是一个当我在操作删除事件操作时候,我希望把即将删除那条数据,保存备用的表中,下面直接看看Oracle数据库中怎么写这样的代码; create or replace trigger 触发器名字 before delete...

    当我们需要用到触发器的时候,还是很方便,你会指定当我在操作某一事件时触发效果完成我所希望完成的事情;这就是触发器,

    下面我给大家上一串代码,这是一个当我在操作删除事件操作时候,我希望把即将删除那条数据,保存备用的表中,下面直接看看Oracle数据库中怎么写这样的代码;

    create or replace trigger 触发器名字
      before delete on 表名
      referencing old as old new as new
      for each row
    begin
      insert into 表名(ID,表的字段)values(:old.id,:old.表的字段);
    end;

    最后F8或者commit;执行一下就可以,是不是很简单。最后也希望能帮助到大家!

    展开全文
  • 获取触发器 参考前面标准写法修改TRIGGER CREATE OR REPLACE TRIGGER "QRPAY"."BANK_CARD_ID_TRG" before insert on bank_card for each row declare -- local variables here begin select bank_card_id...

    今天在生产上准备把新表加入到库中,运维在建表等反面给了一些案例和建议和大家共勉


    1 标准TIGGER写法参考如下
    
    
      CREATE OR REPLACE TRIGGER "QRPAY"."APP_INFO_ID_TRG" BEFORE INSERT OR UPDATE ON  app_info
    FOR EACH ROW
    DECLARE
    v_newVal NUMBER(12) := 0;
    v_incval NUMBER(12) := 0;
    BEGIN
      IF INSERTING AND :new.id IS NULL THEN
        SELECT   app_info_id_seq.NEXTVAL INTO v_newVal FROM DUAL;
        -- If this is the first time this table have been inserted into (sequence == 1)
        IF v_newVal = 1 THEN
          --get the max indentity value from the table
          SELECT NVL(max(id),0) INTO v_newVal FROM  app_info;
          v_newVal := v_newVal + 1;
          --set the sequence to that value
          LOOP
               EXIT WHEN v_incval>=v_newVal;
               SELECT  app_info_id_seq.nextval INTO v_incval FROM dual;
          END LOOP;
        END IF;
        --used to emulate LAST_INSERT_ID()
        --mysql_utilities.identity := v_newVal;
       -- assign the value from the sequence to emulate the identity column
       :new.id := v_newVal;
      END IF;
    END;
    
    ALTER TRIGGER "QRPAY"."APP_INFO_ID_TRG" ENABLE
    
    
    select dbms_metadata.get_ddl('TABLE','BANK_CARD') from dual;
    
    少主健
    
      CREATE TABLE "QRPAY"."BANK_CARD" 
       (	"ID" NUMBER(10,0) NOT NULL ENABLE, 
    	"ACCOUNT_NO" VARCHAR2(21 CHAR), 
    	"ACCOUNT_NAME" VARCHAR2(20 CHAR), 
    	"ID_NUMBER" VARCHAR2(20 CHAR), 
    	"MERCHANT_NO" VARCHAR2(30 CHAR), 
    	"STATUS" VARCHAR2(2 CHAR), 
    	"RESERVED_PHONE" VARCHAR2(12 CHAR), 
    	"CREATE_TIME" DATE, 
    	"CARD_TYPE" VARCHAR2(10 CHAR), 
    	"BANK_NAME" VARCHAR2(10 CHAR)
       ) SEGMENT CREATION IMMEDIATE 
      PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
     NOCOMPRESS LOGGING
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
      BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
      TABLESPACE "QRPAY" 
    --BANK_CARD_ID_SEQ
    --BANK_CARD_ID_TRG
    
    
    select dbms_metadata.get_ddl('SEQUENCE','BANK_CARD_ID_SEQ') from dual;  获取序列
    
       CREATE SEQUENCE  "QRPAY"."BANK_CARD_ID_SEQ"  MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 ORDER  NOCYCLE 
    
    select dbms_metadata.get_ddl('TRIGGER','BANK_CARD_ID_TRG') from dual;  获取触发器
    
    参考前面标准写法修改TRIGGER
    
      CREATE OR REPLACE TRIGGER "QRPAY"."BANK_CARD_ID_TRG" 
      before insert
      on bank_card 
      for each row
    declare
      -- local variables here
    begin
       select bank_card_id_seq.nextval into:New.id from dual;
    end bank_card_id_trg;
    
    ALTER TRIGGER "QRPAY"."BANK_CARD_ID_TRG" ENABLE
    
    


    展开全文
  • 行级触发器顾名思义就是该SQL影响的行数等于执行触发器的次数,语句触发器就是不管该SQL影响多少条数据,你执行一条SQL只触发一次操作 创建触发器行级触发器t_mydel create or replace trigger t_mydel after ...
  • Oracle-触发器SQL语句优化触发器不同的DML(CRUD)操作,触发器能够进行一定的拦截,符合条件的操作方可操作基表,反之不可操作基表。 类似于Filter、Interceptor。为什么要使用触发器呢? 对DML操作做限制,...
  • 触发器与触发该触发器SQL语句同属于一个事务,触发器不允许发出任何事务控制语句,如 commit、rollback、savepoint或者set transaction,它只能随着外部事务的提交、回滚而提交、回滚。(但在oracle8i 以及更高的...
  • /**----------------------- *语句触发器 */ --创建emp副本emp1create table emp1 as select * from emp where 1=2;--插入触发器create or replace trigger trg_emp1_insert_output_numberafter insert on emp1...
  • Oracle创建触发器

    2018-12-15 17:21:03
    文章目录1.说明2.类型3.创建触发器语法4....每当一个特定的数据操作语句(insert,update,delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列。 触发器可用于 数据确认 实施复杂的安全性检...
  • ORACLE创建触发器

    2021-10-20 15:09:44
    EDITIONABLE|NONEDITIONABLE,指明触发器是否允 许被编辑。默认为EDITI-ONABLE。BEFORE|AFTER,触发器在触发事件执行之前...默认为语句级简单 DML触发器,即不管触发语句影响多少行数据,触发器只执 行一次。ENAB...
  • --删除触发器 DROP TRIGGER trigger_name //主键ALTER TABLE base_index_pic ADD CONSTRAINT pk_base_index_pic PRIMARY KEY (ID);//修改列名alter table BASE_ORGANIZATION rename column SCHOOL_IMG to REGION...
  • 原则上使用语句级别触发器SQL server无行级触发器 ​ 5.应避免和杜绝触发器递归: ​ 1.触发器中向本表insert、delete、update ​ 2.触发器中向已经创建过触发器的表insert、delete、update ​ 6.触发器中进行...
  • Oracle 触发器实现DDL语句监控

    千次阅读 2018-08-01 13:14:04
    创建此触发器的主要目的是为了控制数据库的版本,虽然会将DDL语句保留但难免会出现遗漏,所以创建DDl触发器记录DDL操作,主要是用来核对数据库变更的SQL语句 创建用户并授权 #需要使用sys用户授权 CREATE USER ...
  • 触发器实现sql记录

    2008-10-12 19:42:34
    触发器中,需要用到 SQL Server 的 inserted 和 deleted 两个虚拟表,在执行 sql 命令时,这两个虚拟表分别记录的内容如下: sql命令 deleted inserted ------------------------------------------------...
  • oracle创建触发器

    千次阅读 2018-10-08 17:11:51
    3.创建触发器 create or replace trigger t_user_trigger before insert on t_user for each row when( new.id is null) begin select t_user_id_seq.nextval into:NEW.ID from dual; end; #查看触发器 ...
  • (1)选定某一主题,创建一个oracle数据库,对其进行日常管理及应用(全部用SQL语句实现): 1、创建数据库实例,数据库表空间,创建管理员,普通用户,并分别授予相应权限; 2、至少建立5个表,以及表间关系,使用...
  • Oracle数据库触发器

    2018-08-21 10:44:04
    一、触发器(trigger) ...2、作用:当每个特定的数据操作语句(插入insert、更新update、删除delet)注意这里没有查询语句,也就是说查询语句是没有触发器的)这些语句在指定表上发出是,Oracl...
  • Oracle动态sql触发器,函数,exists

    千次阅读 2018-10-12 22:59:42
    后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么OracleSQL引擎就无法在编译期对该程序语句进行确定,只能在用户输入一定的查询条件后才能提交给SQL引擎进行处理。...
  • Oracle查看表触发器

    千次阅读 2020-12-03 16:03:42
    ORACLE查出表所有的触发器触发器详细信息 一.查all_triggers表得到trigger_name Sql代码 select trigger_name from all_triggers where table_name=‘XXX’; 二.根据trigger_name查询出触发器详细信息 Sql代码 ...
  • 说到触发器,它其实就是一种特殊的存储过程,存储过程是需要我们人为的执行,而触发器是通过一个“触发事件”来执行的,这个触发事件可以是行级触发事件、语句级触发事件、替换触发事件或者用户触发事件。...
  • 1、创建表 代码如下: createtableTest_Increase( useridnumber(10)NOTNULLprimarykey,/*主键,自动增加*/ usernamevarchar2(20) ); 2、创建自动增长序列 代码如下: ... 3、创建触发器 代码如下: CREATETRIGGERTest_In
  • ORACLE查出表所有的触发器触发器详细信息 一.查all_triggers表得到trigger_name Sql代码 select trigger_name from all_triggers where table_name='XXX'; 二.根据trigger_name查询出触发器详细信息 Sql代码...
  • Oracle触发器拼接字段

    2020-02-20 14:14:44
    1. 环境准备 1.1 Sql语句 CREATE TABLE STUDENT( ID int, NAME varchar2(20), COURSE varchar2(20), SCORE int, LEV varchar2(3), ...2. Oracle触发器 2.1 基本结构 CREATE [OR REPLACE]...
  • oracle 批量删除触发器

    2017-06-05 15:28:00
    --生成删除触发器语句 select 'drop trigger "'||trigger_name||'";' from all_triggers where TRIGGER_name LIKE '%触发器名字模糊搜索%'然后批量上面SQL执行返回的结果即可达到批量删除触发器的目的 转载于:...
  • 1.触发器介绍 触发器就是一个特殊的存储过程,与普通存储过程不同的是,触发器是... InsteadOf触发器:创建在视图上,用于替代DML操作(Oracle中不能直接对由两个以上的表建立的视图进行操作,所以可以使用InsteadOf触

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,440
精华内容 16,176
关键字:

oracle删除触发器语句sql