使用系统触发器,验证用户删除表操作????

解决方案 »

  1.   

    SQL> create table superman (comeon number,baby varchar2(16));表已创建。SQL> CREATE OR REPLACE TRIGGER TRIG_DROPDENY BEFORE
      2  DROP ON DATABASE begin
      3  IF upper(ora_dict_obj_name ()) = 'SUPERMAN'
      4  THEN
      5  raise_application_error (num => -20000,
      6  msg => '你疯了,想删除表 '
      7  || ora_dict_obj_name ()
      8  || ' ?!!!!!'
      9  || '你完了,警察已在途中.....'
     10  );
     11  END IF;
     12  END;
     13  /触发器已创建SQL> drop table superman;
    drop table superman
    *
    第 1 行出现错误:
    ORA-00604: 递归 SQL 级别 1 出现错误
    ORA-20000: 你疯了,想删除表 SUPERMAN ?!!!!!你完了,警察已在途中.....
    ORA-06512: 在 line 4
      

  2.   

    create table operlog
    --建表
    (op_user varchar2(30), op_time date, op_object varchar2(50), op_type varchar2(30));
    --建立触发器
    CREATE OR REPLACE TRIGGER ddl_audit
      AFTER drop ON DATABASE
    DECLARE
    BEGIN
      INSERT INTO operlog
        (op_user, op_time, op_object, op_type)
      VALUES
        (USER, SYSDATE, ora_dict_obj_name, ora_sysevent);
    END;
    /
      

  3.   

    如果是只针对SCHEMA的,则可将
    AFTER drop ON DATABASE修改为
    AFTER drop ON <用户名>.SCHEMA
      

  4.   

    if ora_dict_obj_type='TABLE' then
        insert into ...........
    end if;
      

  5.   

    oralce 中有 new ,old 。执行删除时应该由old.name属性