精华内容
下载资源
问答
  •  功能描述:关联删除所有外键指向该表的数据行,删除与人员关连的数据行  操作表:  日历提示信息表(calendarNote_tab)  公文基础信息表(documentBaseInfo_tab)  AB角工作分工信息表(divideWork_tab)  ...
  • Oracle数据库-触发器

    2021-07-05 19:57:47
    Oracle数据库-触发器触发器组成编写时注意事项学习时的注意事项 引用-----棒棒的总结:https://www.cnblogs.com/huyong/archive/2011/04/27/2030466.html#!comments 触发器是许多关系数据库系统都提供的一项技术。...

    引用-----棒棒的总结:https://www.cnblogs.com/huyong/archive/2011/04/27/2030466.html#!comments

    触发器是许多关系数据库系统都提供的一项技术。在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块。

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

    触发器组成

    1. 触发事件:引起触发器被触发的事件。 例如:DML语句(INSERT, UPDATE, DELETE语句对表或视图执行数据处理操作)、DDL语句(如CREATE、ALTER、DROP语句在数据库中创建、修改、删除模式对象)、数据库系统事件(如系统启动或退出、异常错误)、用户事件(如登录或退出数据库)。

    2. 触发时间:即该TRIGGER 是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER 的操作顺序。

    3. 触发操作:即该TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。 例如:PL/SQL 块。

    4. 触发对象:包括表、视图、模式、数据库。只有在这些对象上发生了符合触发条件的触发事件,才会执行触发操作。

    5. 触发条件:由WHEN子句指定一个逻辑表达式。只有当该表达式的值为TRUE时,遇到触发事件才会自动执行触发器,使其执行触发操作。

    6. 触发频率:说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器和行级(ROW)触发器。

    语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次;

    行级(ROW)触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。

    编写时注意事项

    1. 触发器不接受参数。

    2. 一个表上最多可有12个触发器,但同一时间、同一事件、同一类型的触发器只能有一个。并各触发器之间不能有矛盾。

    3. 在一个表上的触发器越多,对在该表上的DML操作的性能影响就越大。

    4. 触发器最大为32KB。若确实需要,可以先建立过程,然后在触发器中用CALL语句进行调用。

    5. 在触发器的执行部分只能用DML语句(SELECT、INSERT、UPDATE、DELETE),不能使用DDL语句(CREATE、ALTER、DROP)。

    6. 触发器中不能包含事务控制语句(COMMIT,ROLLBACK,SAVEPOINT)。因为触发器是触发语句的一部分,触发语句被提交、回退时,触发器也被提交、回退了。

    7. 在触发器主体中调用的任何过程、函数,都不能使用事务控制语句。

    8. 在触发器主体中不能申明任何Long和blob变量。新值new和旧值old也不能向表中的任何long和blob列。

    9. 不同类型的触发器(如DML触发器、INSTEAD OF触发器、系统触发器)的语法格式和作用有较大区别。

    学习时的注意事项

    1. 等待补充
    展开全文
  • 数据库事件触发器数据库级和模式级两种。前者定义在整个数据库上,触发事件是数据库事件,如数据库的启动、关闭,对数据库的登录或退出。后者定义在模式上,触发事件包括模式用户的登录或退出,或对数据库对象的...

    数据库事件触发器有数据库级和模式级两种。前者定义在整个数据库上,触发事件是数据库事件,如数据库的启动、关闭,对数据库的登录或退出。后者定义在模式上,触发事件包括模式用户的登录或退出,或对数据库对象的创建和修改(DDL事件)。

    数据库事件触发器的触发事件的种类和级别如表9-3所示。

    Sql代码

    种   类     关 键 字    说     明

    模式级CREATE在创建新对象时触发

    ALTER修改数据库或数据库对象时触发

    DROP删除对象时触发

    数据库级     STARTUP 数据库打开时触发

    SHUTDOWN     在使用NORMAL或IMMEDIATE选项关闭数据库时触发

    SERVERERROR      发生服务器错误时触发

    数据库级与模式级     LOGON    当用户连接到数据库,建立会话时触发

    LOGOFF   当会话从数据库中断开时触发

    种 类 关 键 字 说 明

    模式级 CREATE 在创建新对象时触发

    ALTER 修改数据库或数据库对象时触发

    DROP 删除对象时触发

    数据库级 STARTUP 数据库打开时触发

    SHUTDOWN 在使用NORMAL或IMMEDIATE选项关闭数据库时触发

    SERVERERROR 发生服务器错误时触发

    数据库级与模式级 LOGON 当用户连接到数据库,建立会话时触发

    LOGOFF 当会话从数据库中断开时触发

    定义数据库事件和模式事件触发器

    创建数据库级触发器需要ADMINISTER DATABASE TRIGGER系统权限,一般只有系统管理员拥有该权限。

    对于模式级触发器,为自己的模式创建触发器需要CREATE TRIGGER权限,如果是为其他模式创建触发器,需要CREATE ANY TRIGGER权限。

    数据库事件和模式事件触发器的创建语法与DML触发器的创建语法类似。数据库事件或模式事件触发器的创建语法如下:

    CREATE [OR REPLACE] TRIGGER 触发器名

    {BEFORE|AFTER }

    {DDL事件1 [DDL事件2...]| 数据库事件1 [数据库事件2...]}

    ON {DATABASE| [模式名.]SCHEMA }

    [WHEN (条件)]

    DECLARE

    声明部分

    BEGIN

    主体部分

    END;

    其中:DATABASE表示创建数据库级触发器,数据库级要给出数据库事件;SCHEMA表示创建模式级触发器,模式级要给出模式事件或DDL事件。

    在数据库事件触发器中,可以使用如表9-4所示的一些事件属性。不同类型的触发器可以使用的事件属性有所不同。

    Sql代码

    属   性     适用触发器类型 说     明

    Sys.sysevent     所有类型     返回触发器触发事件字符串

    Sys.instance_num     所有类型     返回Oracle实例号

    Sys.database_name    所有类型     返回数据库名字

    Sys.server_error(stack_position)     SERVERERROR 从错误堆栈指定位置返回错误号,参数为1表示最近的错误

    Is_servererror(error_number)     SERVERERROR 判断堆栈中是否有参数指定的错误号

    Sys.login_user   所有类型     返回导致触发器触发的用户名

    Sys.dictionary_obj_typeCREATE、ALTER、DROP返回DDL触发器触发时涉及的对象类型

    Sys. dictionary_obj_nameCREATE、ALTER、DROP返回DDL触发器触发时涉及的对象名称

    Sys.des_encrypted_passwordCREATE、ALTER、DROP创建或修改用户时,返回加密后的用户密码

    属 性 适用触发器类型 说 明

    Sys.sysevent 所有类型 返回触发器触发事件字符串

    Sys.instance_num 所有类型 返回Oracle实例号

    Sys.database_name 所有类型 返回数据库名字

    Sys.server_error(stack_position) SERVERERROR 从错误堆栈指定位置返回错误号,参数为1表示最近的错误

    Is_servererror(error_number) SERVERERROR 判断堆栈中是否有参数指定的错误号

    Sys.login_user 所有类型 返回导致触发器触发的用户名

    Sys.dictionary_obj_type CREATE、ALTER、DROP 返回DDL触发器触发时涉及的对象类型

    Sys. dictionary_obj_name CREATE、ALTER、DROP 返回DDL触发器触发时涉及的对象名称

    Sys.des_encrypted_password CREATE、ALTER、DROP 创建或修改用户时,返回加密后的用户密码

    数据库事件触发器

    下面是一个综合的数据库事件触发器练习。先为STUDENT账户授予创建数据库事件触发器的权限,ADMINISTER DATABASE TRIGGER,然后创建有关的表和触发器,最后予以验证。

    【训练1】 创建触发器,对本次数据库启动以来的用户登录时间进行记录,每次数据库启动后,先清空该表。

    步骤1:创建登录事件记录表:

    Sql代码

    CREATETABLEuserlog (

    USERNAME VARCHAR2(20),

    LOGON_TIMEDATE);

    CREATE TABLE userlog (

    USERNAME VARCHAR2(20),

    LOGON_TIME DATE);

    执行结果:

    Sql代码

    表已创建。

    表已创建。

    步骤2:创建数据库STARTUP事件触发器:

    Sql代码

    CREATEORREPLACETRIGGERINIT_LOGON

    AFTER

    STARTUP

    ONDATABASE

    BEGIN

    DELETEFROMuserlog;

    END;

    CREATE OR REPLACE TRIGGER INIT_LOGON

    AFTER

    STARTUP

    ON DATABASE

    BEGIN

    DELETE FROM userlog;

    END;

    执行结果:

    Sql代码

    触发器已创建。

    触发器已创建。

    步骤3:创建数据库LOGON事件触发器:

    Sql代码

    CREATEORREPLACETRIGGERDATABASE_LOGON

    AFTER

    LOGON

    ONDATABASE

    BEGIN

    INSERTINTOuserlog

    VALUES(sys.login_user,sysdate);

    END;

    CREATE OR REPLACE TRIGGER DATABASE_LOGON

    AFTER

    LOGON

    ON DATABASE

    BEGIN

    INSERT INTO userlog

    VALUES(sys.login_user,sysdate);

    END;

    执行结果:

    Sql代码

    触发器已创建。

    触发器已创建。

    步骤4:验证DATABASE_LOGON触发器:

    Sql代码

    CONNECTSCOTT/TIGER@MYDB;

    CONNECTSTUDENT/STUDENT@MYDB;

    CONNECT SCOTT/TIGER@MYDB;

    CONNECT STUDENT/STUDENT@MYDB;

    执行结果:

    Sql代码

    已连接。

    已连接。

    已连接。

    已连接。

    执行查询:

    Sql代码

    SELECTusername,TO_CHAR(logon_time,'YYYY/MM/DD HH24:MI:SS')FROMuserlog;

    SELECT username,TO_CHAR(logon_time,'YYYY/MM/DD HH24:MI:SS') FROM userlog;

    执行结果:

    Sql代码

    USERNAME              TO_CHAR(LOGON_TIME,

    ----------------------------- -----------------------------------------

    SCOTT                    2004/03/29 22:42:20

    STUDENT                  2004/03/29 22:42:20

    USERNAME TO_CHAR(LOGON_TIME,

    ----------------------------- -----------------------------------------

    SCOTT 2004/03/29 22:42:20

    STUDENT 2004/03/29 22:42:20

    步骤5:验证INIT_LOGON触发器。

    重新启动数据库,登录STUDENT账户:

    Sql代码

    SELECTusername,TO_CHAR(logon_time,'YYYY/MM/DD HH24:MI:SS')FROMuserlog;

    SELECT username,TO_CHAR(logon_time,'YYYY/MM/DD HH24:MI:SS') FROM userlog;

    执行结果:

    Sql代码

    USERNAME              TO_CHAR(LOGON_TIME,

    -------------------------------- ---------------------------------------

    STUDENT               2004/03/29 22:43:59

    已选择 1 行

    USERNAME TO_CHAR(LOGON_TIME,

    -------------------------------- ---------------------------------------

    STUDENT 2004/03/29 22:43:59

    已选择 1 行

    说明:本例中共创建了两个数据库级事件触发器。DATABASE_LOGON在用户登录时触发,向表userlog中增加一条记录,记录登录用户名和登录时间。INIT_LOGON在数据库启动时触发,清除userlog表中记录的数据。所以当数据库重新启动后,重新登录STUDENT账户,此时userlog表中只有一条记录。

    【训练2】 创建STUDENT_LOGON模式级触发器,专门记录STUDENT账户的登录时间:

    Sql代码

    CREATEORREPLACETRIGGERSTUDENT_LOGON

    AFTER

    LOGONONSTUDENT.SCHEMA

    BEGIN

    INSERTINTOuserlog

    VALUES(sys.login_user,sysdate);

    END;

    CREATE OR REPLACE TRIGGER STUDENT_LOGON

    AFTER

    LOGON ON STUDENT.SCHEMA

    BEGIN

    INSERT INTO userlog

    VALUES(sys.login_user,sysdate);

    END;

    执行结果:

    Sql代码

    触发器已创建。

    触发器已创建。

    说明:为当前模式创建触发器,可以省略SCHEMA前面的模式名。

    【练习1】修改DATABASE_LOGON触发器和userlog表,增加对退出时间的记录。

    DDL事件触发器

    【训练1】 通过触发器阻止对emp表的删除。

    步骤1:创建DDL触发器:

    Sql代码

    CREATEORREPLACETRIGGERNODROP_EMP

    BEFORE

    DROPONSCHEMA

    BEGIN

    IF Sys.Dictionary_obj_name='EMP'THEN

    RAISE_APPLICATION_ERROR(-20005,'错误信息:不能删除emp表!');

    ENDIF;

    END;

    CREATE OR REPLACE TRIGGER NODROP_EMP

    BEFORE

    DROP ON SCHEMA

    BEGIN

    IF Sys.Dictionary_obj_name='EMP' THEN

    RAISE_APPLICATION_ERROR(-20005,'错误信息:不能删除emp表!');

    END IF;

    END;

    执行结果:

    Sql代码

    触发器已创建。

    触发器已创建。

    步骤2:通过删除emp表验证触发器:

    Sql代码

    DROPTABLEemp;

    DROP TABLE emp;

    执行结果:

    Sql代码

    DROPTABLEemp

    *

    ERROR 位于第 1 行:

    ORA-00604: 递归 SQL 层 1 出现错误

    ORA-20005: 错误信息:不能删除emp表!

    ORA-06512: 在line 3

    展开全文
  • 触发器的作用触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的...(2) 跟踪变化Auditing changes触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。(3) 级联运行(Cascaded...

    触发器的作用

    触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。除此之外,触发器还有其它许多不同的功能:

    (1) 强化约束(Enforce restriction)

    触发器能够实现比CHECK 语句更为复杂的约束。

    (2) 跟踪变化Auditing changes

    触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。

    (3) 级联运行(Cascaded operation)。

    触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。

    (4) 存储过程的调用(Stored procedure invocation)。

    为了响应数据库更新触,发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS( 数据库管理系统)本身之外进行操作。

    由此可见,触发器可以解决高级形式的业务规则或复杂行为限制以及实现定制记录等一些方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型(INSERT、 UPDATE、 DELETE)的多个触发器能够对同一种数据操作采取多种不同的处理。

    总体而言,触发器性能通常比较低。

    当运行触发器时,系统处理的大部分时间花费在参照其它表的这一处理上,因为这些表既不在内存中也不在数据库设备上,而删除表和插入表总是位于内存中。可见触发器所参照的其它表的位置决定了操作要花费的时间长短。触发器的功能强大,轻松可靠地实现许多复杂的功能,尽管如此,触发器还是要慎用的,触发器本身没有过错,但由于我们的滥用会造成数据库及应用程序的维护困难。在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作…… 同时规则、约束、缺省值也是保证数据完整性的重要保障。如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程序。

    【编辑推荐】

    【责任编辑:迎迎 TEL:(010)68476606】

    展开全文
  • Oracle数据库触发器

    2018-05-17 15:55:00
     1)系统触发器:由系统事件触发的plsql程序,比如登陆oracle数据库,登出oracle。  2)DML触发器:由DML语句触发的plsql程序,比如增删改。 三:DML触发器  -->语句触发器  a.如果执行完一条DML语句后,...

    一:概念

      是oracle在发生某些事件时,可以自动触发并调用的plsql程序,可以定义在事件上,由事件自动触发。

    二:分类

      1)系统触发器:由系统事件触发的plsql程序,比如登陆oracle数据库,登出oracle。

      2)DML触发器:由DML语句触发的plsql程序,比如增删改。

    三:DML触发器

      -->语句触发器

        a.如果执行完一条DML语句后,希望对整张表的数据进行预算,使用语句触发器,这种触发器是在DML执行前/后自动触发的。

        b.语法

          create [or replace] trigger 触发器名   

          before | after insert | update | delete on 表

          declare

            --变量声明区

          begin

            --处理业务

          end;

          /  

          注:触发器自动调用,在DML语句执行之前或之后。

        c.练习:在进行任何增删改操作后,计算出员工数,员工薪资合计,员工平均工资。

          create or replace trigger emp_tri

          after insert or update or delete on emp

          declare

            count_emp number;

            sal_total number;

              sal_avg number;

          begin

            select count(*) into count_emp from emp;

            select sum(sal) into sal_total from emp;

            select avg(sal) into sal_avg from emp;

            dbms_output.put_line(count_emp||'  '||sal_total||'  '||sal_avg);

          end;

          /

        update emp set sal = 1000 where empno=7698;--当我们执行此sql语句时,触发器就会触发,输出相应的值。

      -->行级触发器

        a.如果在执行DML时,希望对当前操作的数据进行处理,那么可以使用行级触发器。行级触发器也是在执行DML之前/后自动触发的,在行级触发器中可以使用行变量引用到DML所操作的数据,这个行变量是内置的,可以直接使用。

        b.行变量

          --  :new  表示引用的是新增后的行数据

          --  :old  表示引用的是修改/删除前的行数据

          --  规则

              insert语句只有:new,表示插入后的数据。

              delete语句只有:old,表示删除前的旧的数据。

              update语句二者都有,new表示修改后的数据,old表示修改前的数据。

        c.语法

          create or replace trigger 触发器名

          before | after insert | update | delete on 表名  

          for each row

          declare

            --声明变量

          begin    

            --业务逻辑

          end;

          /

        d.练习:删除dept表数据之前,将删除记录存入备份表。

        create or replace trigger dept_trig

        before delete on dept

        for each row

        declare

        begin  

          insert into dept_bak values(:old,deptno,:old.name,:old.loc);

        end;

        /

      注:触发器不要写commit。 

     

    转载于:https://www.cnblogs.com/lyr999736/p/9051553.html

    展开全文
  • Oracle 数据库事件触发器

    千次阅读 2010-08-13 11:03:00
    数据库事件触发器数据库级和模式级两种。前者定义在整个数据库上,触发...Sql代码种 类 关 键 字 说 明 模式级 CREATE 在创建新对象时触发 ALTER 修改数据库数据库对象时触发 DROP 删除对象时触发 数据库
  • 请问写一个触发器,怎么在根据id删除商品时,用触发器删除这个商品对应的购物车表项,订单明细表,以及这个订单明细表对应的订单表,删除这个订单表时还要删除这个订单表中对应的其他明细表,谢谢了,最好能有点代码...
  • oracle数据库(触发器)

    2018-02-02 15:05:50
    触发器 触发器是一种过程,与表关系密切,用于...DML触发器oracle可以在DML语句进行触发,可以再DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发 替代触发器:由于在oracle里,不能直接对由
  • ---创建触发器dept_trigger create or replace trigger dept_trigger  --触发条件(对dept_bak中每行数据进行插入编辑删除时触发)  before insert or update or delete on dept_bak for each row begin   ...
  • 触发器trigger是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发。比如当对一个表进行操作(insert,...
  • 做期末项目,做到了触发器集联删除这块,我想删除course表(父表)里的数据,必须先删除teacou(子表)中的cid,cid与course里的id有外键关系。删除子表后我又不能找到父表里的id了。 select teaCou.cId from teaCou ...
  • 利用触发器对在scott.emp表上执行的DML操作进行安全性检查,只有scott用户登录数据库后才能向该表中执行DML操作。(第1题中,user是系统函数,返回当前用户。字符串中使用两个单引号表示一个单引号。) 要求:分别...
  • 2、触发时间 是在触发事件发生之前(before) 还是之后(after) 触发3、触发操作 使用PL/SQL块进行相应的数据库操作4、触发对象 表、视图、模式、数据库5、触发频率 触发器内定义的动作被执行的次数,包括语句级和...
  • 222222222222222
  • Oracle触发器、存储过程、函数、包
  • Oracle数据库触发器

    2018-08-21 10:44:04
    数据库触发器是一个与数据库中表相关联的、存储的PL/SQL程序。这意味着触发器是定义在表上面的程序。 2、作用:当每个特定的数据操作语句(插入insert、更新update、删除delet)注意这里没有查询语句,也就是说...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 34,306
精华内容 13,722
关键字:

oracle数据库删除触发器