Oracle DB:丢弃表(DDL)触发器

时间:2016-12-18 22:47:29

标签: oracle

我需要使用oracle中的某些表来限制对DDL的访问,禁止删除表。我怎么能这样做?我只能为数据库和模式创建DDL触发器

create table my_table(
  id int primary key not null,
  first_val int,
  second_val int
);

create trigger delete_disabling_trigger
  before drop on database
begin
  if --some condition
    dbms_output.put_line('delete_disabling_trigger');
    RAISE_APPLICATION_ERROR(-175,'Cant delete this table');
  end if;
end;

2 个答案:

答案 0 :(得分:2)

如果您需要某个人无法删除的表,您可以在另一个模式中创建该表。授予为使用该表的用户选择,插入,更新,删除和创建同义词的权限。

场景:用户X需要无法删除的表T.

Create user persist identified by password.
Create table persist.T ...
GRANT SELECT, INSERT, UPDATE, DELETE on persist.T to X;
create synonym X.T for persist.T;

在这种情况下,X可以操纵数据,但不能更改结构或删除表。使用触发器似乎是阻止丢弃表的奇怪解决方案。

修改

create or replace trigger delete_disabling_trigger
  before drop on database
begin
    if(ORA_DICT_OBJ_NAME = 'MY_TABLE') then --and ORA_DICT_OBJ_OWNER = 'YOUR_SCHEMA'  
    dbms_output.put_line('delete_disabling_trigger');
    RAISE_APPLICATION_ERROR(-20000,'Cant delete this table');
    end if;
end;
/

答案 1 :(得分:0)

我刚刚实现了一个触发器来阻止5个表的丢弃,这些表正在被一些尚未知的进程从2个开发模式中删除。我们在具有自治事务的表中注册该尝试,并停止丢弃。

我希望尽快确定这个过程并摆脱触发器。

CREATE OR REPLACE TRIGGER whos_dropping_my_table
BEFORE DROP
ON database
declare
   PRAGMA AUTONOMOUS_TRANSACTION;
begin
  insert into some_table_I_prepared_earlier
  VALUES( SUBSTR(ora_sysevent,1,50),
          SUBSTR(ora_dict_obj_owner,1,50),
          SUBSTR(ora_dict_obj_name,1,50),
          SUBSTR(ora_dict_obj_TYPE,1,50),
          UPPER(sys_context('USERENV','TERMINAL')),
          SYSDATE,
          UPPER(sys_context('USERENV','OS_USER'))
        );
  commit;

  if SUBSTR(ora_dict_obj_name,1,50) in     
           ('TABLE_1','TABLE_2','TABLE_3','TABLE_4','Table_5')
  then
    begin
      RAISE_APPLICATION_ERROR(num => -20998, 
                        msg => 'Stop deleting my table, whoever you are'); 
    end;
  end if;
end;