我需要使用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;
答案 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;