2024-03-19  阅读(50)
原文作者:吴声子夜歌 原文地址: https://blog.csdn.net/cold___play/article/details/103846793

语句级触发器

创建语句级触发器,当添加学生时弹出“用户注册窗口”。

    create or replace trigger tr_student
    before insert on student
    begin
      dbms_output.put_line('欢迎新同学!');
    end;

执行:

202403192031388641.png

利用触发器实现日志管理功能。该触发器用来实现当在Student表中删除一条数据时,在stu_log表中添加一条包含当前操作用户(USER)和当前操作日期(SYSDATE)的记录

创建日志表:

    create table stu_log(
     WHO varchar2(20),
     WHEN DATE);

创建触发器:

    create or replace trigger tr_stu_log
    after delete
    on student
    begin 
      insert into stu_log values(USER,SYSDATE);
    end;

测试:

202403192031391702.png

行级触发器

如果在某个表上创建了一个触发器,在对这个表进行DML操作时,每当影响一行数据,该触发器都将被激发执行一次,那么这个触发器就是行级触发器。

在行级触发器中有一个很重要的特点,当创建BEFORE行级触发器时,可以在触发器中引用受到影响的行值,甚至可以用在触发器中设置它们。

创建一个简单的行级触发器,如果对表Student进行DELETE操作,每删除一条符合条件的记录,就显示一次字符串“1行已经被删除”。

    create or replace trigger tr_stu_del
    after delete
    on student
    for each row
    declare
    begin
      dbms_output.put_line('1行已经被删除!');
    end;

测试:

202403192031394263.png

需要注意的是,在创建行级触发器时,可以指定一些条件,这样只有当特定的数据受到DML影响时,触发器才被执行。创建触发器时,可以在FOR EACH ROW子句之后使用WHEN子句指定条件。

重新编写上面例子的触发器,要求对SNAME为“张三”进行监视,只有当从表Student中删除SNAME列值为‘张三’的行时,才激发触发器。

    create or replace trigger tr_stu_del
    after delete
    on student
    for each row when(old.SNAME='张三')
    declare
    begin
      dbms_output.put_line('1行已经被删除!');
    end;

测试:

202403192031396934.png

在行级触发器中,同样可以使用条件谓词 INSERT、UPDATING和DELETING ,以判断当前所进行的DML操作。行级触发器通常用于对用户的DML操作进行合法性检查,使得用户修改数据的操作必须按照一定的规则进行。

为了能够比较修改前和修改后的数据,在触发器的可执行代码中,可以使用两个关联行—— NEW和OLD 。它们为别表示触发器被激发时,当前行的原数据和新数据。:NEW和:OLD也称之为系统变量,由Oracle系统管理,存储在内存中,不允许用户直接对其进行修改。:NEW和:OLD变量的结构总是与执行DML操作的表的结构相同。当触发器工作完成以后,这两个变量也随之消失。这两个变量的值是只读的,即用户不能向这两个变量写入内容,但可以引用变量中的数据。

  • :OLD 变量用于DELETE和UPDATE操作所影响的行的副本。当执行DELETE或UPDATE操作时,行从触发表中被删除,并传输到:OLD变量中。
  • :NEW 变量用户存储INSERT和UPDATE操作所影响的行的副本。当执行INSERT或UPDATE操作时,新行被添加到:NEW变量和触发表中,:NEW变量中的行即为触发表中新行的副本。

另外,需要注意的是,在触发器的可执行代码中,如果要通过OLD和NEW引用某个列的值,要在前面加上“:”,在其他地方不能使用“:”。

阅读全文
  • 点赞