暂无图片
oracle 创建删除触发器,不生效,还是可以删除。
我来答
分享
Mark
2023-11-23
oracle 创建删除触发器,不生效,还是可以删除。

CREATE OR REPLACE TRIGGER EAP.DROP_TRIGGER
before drop on schema
begin
raise_application_error(-20000, 'con_not_drop!');
end;

我来答
添加附件
收藏
分享
问题补充
8条回答
默认
最新
Mr.Cui

只限制schema, 不限制其他用户吧,是用schema测试的吗

暂无图片 评论
暂无图片 有用 1
打赏 0
董大威

你是用sysdba删除的吧?

暂无图片 评论
暂无图片 有用 1
打赏 0
董大威
答主
2023-11-23
sysdba身份好像拦截不了
Thomas

如果TRIGGER的属主SCHEMA,即EAP,要DROP 任何EAP.*, 会触发该TRIGGER。如果别的SCHEMA(比如SYS和ABC用户),拥有DROP ANY TABLE 的权限,那么这些用户drop table EAP.table1时,不会触发该TRIGGER。作者的目的,无非是想禁止EAP下的OBJECT被错误地DROP掉。那只能是在TRIGGER里加如下语句,显式地列出拥有DROP权限的SCHEMA, 对其做限制:

if upper(ora_login_user) in ('SYS','ABC') then

raise_application_error(-20000, 'con_not_drop!');

end if;

暂无图片 评论
暂无图片 有用 2
打赏 0
Mark
题主
2023-11-24
在eap用户创建的触发器,创建表,然后删除表还是没有触发提示。
Mark

我这样创建的还是会被删除。没有提示

暂无图片 评论
暂无图片 有用 0
打赏 0
董大威
2023-11-24
我用19C普通用户测试是没问题的
Thomas

先记录一下当时的ora_login_user再说:

 create table tb_who_drops(schema_name varchar2(40),drop_time date);

TRIGGER改成如下:

CREATE OR REPLACE TRIGGER DROP_TRIGGER
before drop on schema
begin
insert into tb_who_drops values (ora_login_user,sysdate);
--raise_application_error(-20000, 'can_not_drop!');
end;

/

然后EAP用户DROP一个OBJECT,再查询TB_WHO_DROPS,看看是否记录了 ora_login_user

暂无图片 评论
暂无图片 有用 0
打赏 0
Mark
题主
2023-11-24
SQL> create table tb_who_drops(schema_name varchar2(40),drop_time date); Table created. CREATE OR REPLACE TRIGGER DROP_TRIGGER2 before drop on schema begin insert into tb_who_drops values (ora_login_user,sysdate); --raise_application_error(-20000, 'can_not_drop!'); end; 7 / Trigger created. SQL> drop table temp; Table dropped. SQL> select * from tb_who_drops; no rows selected SQL>
Thomas

那就怪了,说明EAP用户DROP表时,根本没有触发该触发器。我的环境是12.0.1,你是11GR2,应该没啥区别吧。

暂无图片 评论
暂无图片 有用 0
打赏 0
Mark
题主
2023-11-24
有点奇怪了,我所有库,版本跟这个一样的都可以,就这个不行。。
雉云

CREATE OR REPLACE TRIGGER DROP_TRIGGER
before drop on EAP.SCHEMA
begin
--insert into tb_who_drops values (ora_login_user,sysdate);
raise_application_error(-20000, 'can_not_drop!');
end;
/

试试看指定EAP用户是否生效,我这边操作sys指定EAP用户,或是EAP用户直接schema都可以被触发器限制

暂无图片 评论
暂无图片 有用 0
打赏 0
Mark
题主
2023-11-24
CREATE OR REPLACE TRIGGER DROP_TRIGGER before drop on EAP.SCHEMA begin --insert into tb_who_drops values (ora_login_user,sysdate); raise_application_error(-20000, 'can_not_drop!'); end; 7 / Trigger created. SQL> show user; USER is "EAP" SQL> create table temp(id INTEGER,name VARCHAR(20)); Table created. SQL> insert into temp VALUES(1,22222); 1 row created. SQL> select * from temp; ID NAME ---------- -------------------- 1 22222 SQL> drop table temp; Table dropped. SQL>
Thomas

我怀疑可能和EAP用户某些权限有关。要不这样,禁用EAP下的相关DROP_TRIGGER。然后在SYS用户下:

create table tb_who_drops(schema_name varchar2(40),drop_time date);

CREATE OR REPLACE TRIGGER DROP_TRIGGER
before drop on database
begin
insert into tb_who_drops values (ora_login_user,sysdate);
end;

/

然后EAP用户登录,去DROP一个它下面的OBJECT。之后在SYS.TB_WHO_DROPS查一下有无记录相关记录(我测试时是记录了的)。如有记录,则改SYS下的DROP_TRIGGER如下,也可以达到同样效果,任何用户都不能DROP EAP用户下的OBJECT了:

CREATE OR REPLACE TRIGGER DROP_TRIGGER
before drop on database
begin
if upper(ora_dict_obj_owner)='EAP' THEN
raise_application_error(-20000, 'can_not_drop!');
END IF;
end;

/

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交