my814768003 2017-09-03 03:00 采纳率: 50%
浏览 388

关于ddl触发器,在匹配触发条件的时候总是报错,有没有大佬可以帮忙解答一下呢,求教

数据库是oracle,配置一个ddl触发器,针对direct用户,一旦有删表的操作,如果是匹配到我规定的20170901的表就记录下来
create table ddl_log(create_time date,op_table varchar2(128),op_user varchar2(30),op_type varchar2(64),is_send number default '0');--新建一张记录事件的表。
CREATE OR REPLACE TRIGGER DROP_DDL_TRIGGER AFTER DROP
ON DIRECT.SCHEMA
declare
col number;
begin
select count(*) into col from dba_objects WHERE owner='DIRECT' AND LAST_DDL_TIME=SYSDATE and OBJECT_NAME='test_20170901';
if col>0 then
insert into ddl_log(create_time,op_table,op_type) values((select sysdate from dual),'test_20170901','drop');
END IF;
END;
然后ddl触发器报错在select那一行说表或视图不存在(其实dba_objects这个表是肯定存在的),接着我有用另一种方法写触发器。
CREATE OR REPLACE TRIGGER DROP_DDL_TRIGGER AFTER DROP
ON DIRECT.SCHEMA
begin
if EXISTS(SELECT 1 FROM dba_objects WHERE owner='DIRECT' AND LAST_DDL_TIME=(SELECT SYSDATE FROM DUAL) AND OBJECT_NAME='test_20170901') THEN
insert into ddl_log(create_time,op_table,op_type) values(sysdate,'test_20170901','drop');
END IF;
END;
然后又报错说exists只能由于sql语句,请问怎么解决!求教

  • 写回答

1条回答

  • 喝茶品人生 2023-04-20 13:26
    关注

    if里面不能用exists,试一试这样:

    CREATE OR REPLACE TRIGGER DROP_DDL_TRIGGER
    AFTER DROP ON DIRECT.SCHEMA
    DECLARE
        col NUMBER;
    BEGIN
        SELECT COUNT(*)
        INTO col
        FROM dba_objects
        WHERE owner='DIRECT'
        AND last_ddl_time=SYSDATE
        AND object_name='test_20170901';
        IF col > 0 THEN
            INSERT INTO ddl_log(create_time, op_table, op_type)
            VALUES(SYSDATE, 'test_20170901', 'drop');
        END IF;
    END;
    
    
    
    本回答被专家选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 专家已采纳回答 4月20日

悬赏问题

  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型
  • ¥50 buildozer打包kivy app失败
  • ¥30 在vs2022里运行python代码
  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题