【发布时间】:2018-12-15 06:38:45
【问题描述】:
我想用ddl触发器(drop前)创建一个备份表,遇到了以下问题。
发生第一次删除时没关系:a_backup 表包含已删除表的数据。但是为什么我不能在此之后删除另一个表?
ORA-01031: 权限不足
create table b (x number);
-- 表 B 已创建。
create table a (x number);
-- 表 A 已创建。
create table a_backup as select * from a where 1 = 0;
-- 表 A_BACKUP 已创建。
create or replace trigger a_backup_tr
before drop
on database
begin
IF ora_dict_obj_name <> 'A' then
null;
ELSIF ora_dict_obj_name = 'A'
and ora_dict_obj_owner = 'TRANEE' then
insert into a_backup
select * from a;
ELSE null;
end if;
end;
/
-- 触发A_BACKUP_TR编译
-- 1
drop table a;
-- 表 A 已删除。
-- 2
drop table b;
-- ORA-04045: 重新编译/重新验证 TRANEE.A_BACKUP_TR 时出错
-- ORA-01031: 权限不足
并且您不能在删除后删除任何表,除非您再次运行创建或替换触发器脚本。 IF-THEN 部分有问题吗?当表A不存在时,IF语句必须进入NULL吗?
【问题讨论】:
-
刚刚注意到您在问题中开发的功能与 Oracle 的 recyclebin 功能非常相似。
标签: oracle plsql triggers ddl-trigger