CH07_触发器练习

作者: 小小蒜头 | 来源:发表于2017-09-05 21:12 被阅读23次

    --1 创建触发器,当test表执行DML语句时,将相关信息记录到日志表
    -- 当前用户: user
    SELECT USER FROM DUAL;

    --创建测试表
    CREATE TABLE test
    (
    t_id NUMBER(4), --编号
    t_name VARCHAR2(20), --姓名
    t_age NUMBER(2), --年龄
    t_sex CHAR --性别
    );

    --创建记录测试表
    CREATE TABLE test_log
    (
    l_user VARCHAR2(15), --用户
    l_type VARCHAR2(15), --操作类型
    l_date VARCHAR2(30) --操作日期
    );
    --测试数据
    INSERT INTO test VALUES(101,'zhao',22,'M');
    UPDATE test SET t_age = 30 WHERE t_id = 101;
    DELETE test WHERE t_id = 101;

    create or replace trigger tri_test
    after delete or insert or update on test 
    declare
     v_tag varchar2(10);
    begin
      if inserting then v_tag := '插入';
      elsif updating then v_tag := '修改';
      elsif deleting then v_tag := '删除';
      end if;
      insert into test_log values((SELECT USER FROM DUAL),v_tag,sysdate);
    end;
    

    --2 创建触发器,它记录表的删除数据 ,将删除的数据存储到old_employee 表中
    --创建表
    CREATE TABLE employee
    (
    id VARCHAR2(4) NOT NULL, --编号
    name VARCHAR2(15) NOT NULL, --姓名
    age NUMBER(2) NOT NULL, --年龄
    sex CHAR NOT NULL --性别
    );
    --插入数据
    INSERT INTO employee VALUES('e101','zhao',23,'M');
    INSERT INTO employee VALUES('e102','jian',21,'F');

    create or replace trigger save_deletedata_oldemp 
    before delete on employee 
    for EACH ROW
    begin
      insert into old_employee values(:old.id,:old.name,:old.age,:old.sex);
    end;
    

    --3.不允许删除20部门的人

    delete EMP where empno=7369;
    
    create or replace trigger tri_emp
    after delete on emp 
    for each row
    begin
      if :old.deptno=20 
      then
      SYS.DBMS_OUTPUT.PUT_LINE('您不能删除20部门的员工');
      insert into EMP values(:old.empno,:old.ename,:old.job,:old.mgr,:old.hiredate,:old.sal,:old.comm,:old.deptno);
      end if;
    end;
    

    --4.当员工姓名是丁院院时,执行触发器

    create or replace trigger tri_nameis 
    before delete or insert or update on emp 
    for each row
    begin
     if inserting then 
      if :new.ename='丁院院' then
      DBMS_OUTPUT.PUT_LINE('您插入数据了');
      end if;
    elsif updating then 
     if :new.ename='SMITH' or :old.ename='SMITH'then
       DBMS_OUTPUT.PUT_LINE('您更新了数据');
     end if;
    elsif deleting then 
    if :old.ename='SMITH' then
       DBMS_OUTPUT.PUT_LINE('您删除了数据');
       end if;
      end if;
    end;
    

    --测试数据

    update emp set sal=1000 where ename='丁院院';
    

    相关文章

      网友评论

        本文标题:CH07_触发器练习

        本文链接:https://www.haomeiwen.com/subject/hwupjxtx.html