Oracle 11g:ORA-00604:递归SQL级别1发生错误

时间:2014-07-23 04:04:32

标签: sql oracle11g

我执行了下面的脚本并且有效:

BEGIN
   FOR cur_rec IN (SELECT object_name, object_type
                 FROM user_objects
                WHERE object_type IN
                         ('TABLE',
                          'VIEW',
                          'PACKAGE',
                          'PROCEDURE',
                          'FUNCTION',
                          'SEQUENCE'
                         ))
 LOOP
  BEGIN
     IF cur_rec.object_type = 'TABLE'
     THEN
        EXECUTE IMMEDIATE    'DROP '
                          || cur_rec.object_type
                          || ' "'
                          || cur_rec.object_name
                          || '" CASCADE CONSTRAINTS';
     ELSE
        EXECUTE IMMEDIATE    'DROP '
                          || cur_rec.object_type
                          || ' "'
                          || cur_rec.object_name
                          || '"';
     END IF;
  EXCEPTION
     WHEN OTHERS
     THEN
        DBMS_OUTPUT.put_line (   'FAILED: DROP '
                              || cur_rec.object_type
                              || ' "'
                              || cur_rec.object_name
                              || '"'
                             );
  END;
   END LOOP;
END;
/

但问题是,在此之后,我无法在我的数据库中授予,创建或删除等,即使我正在使用sysdba用户。

我收到错误:

  

ORA-00604:递归SQL级别1发生错误   ORA-00942:表或视图不存在

请帮忙。感谢。

1 个答案:

答案 0 :(得分:3)

递归SQL错误的一个可能原因是触发器。您可能遇到过这种情况:

  • 您有触发每个DDL语句的触发器
  • 此触发器尝试将记录插入某种审计/日志表
  • 您的审核/日志表已被清理脚本删除

要获取所有触发器的列表,您可以使用

select * from dba_triggers
where trigger_type not in ('BEFORE EACH ROW','AFTER EACH ROW')

(您可以排除行级触发器,因为它们在概念上属于表,并且在删除表时会自动删除)。在确定违规触发器后,您可以禁用或删除它。