Oracle:在drop用户上创建触发器

时间:2012-08-24 00:07:51

标签: oracle triggers oracle11g

是否可以在drop user事件中创建触发器?如果是这样,我该怎么写触发器 - *我想在删除用户*

后从表中删除与该用户相关的一些行

“删除用户”

你能提供一个例子:

如果用户是drop并且oracle清除了用户的架构对象,那么我可以选择要保留或删除的数据行吗?

您是说在删除用户事件时无法创建触发器?

2 个答案:

答案 0 :(得分:2)

当然可以。假设您实际上是在删除用户而不是表:

您正在寻找system trigger而不是架构触发器或数据库触发器。您可以将这些内容添加到大量ddl events,包括DROP

引用文档:

  

使数据库在DROP语句时触发触发器   从数据字典中删除数据库对象。

您的触发器可能如下所示:

create or replace trigger tr_drop_user
  before drop on database

begin
   if dbms_standard.dictionary_obj_type = 'USER' then

      insert into logs ( user, object_name )
      values ( sys_context('USERENV','OS_USER') -- OS User doing the dropping
             , dbms_standard.dictionary_obj_name -- name of object being dropped
              );

   end if;
end;
/

这会使用not particularly well documented dbms_standard包来计算发生的情况。在我看来,PSOUG有better documentation

如果您只想为特定架构而不是整个数据库执行此操作,请改为使用before drop on schema


正如一点注意事项我不相信需要在触发器中执行此操作。如果您创建一个包含drop_usercreate_user过程的程序包,可以在一个地方执行您想要的任何操作,而不是伪装触发器中的逻辑,那会更好。

答案 1 :(得分:0)

您无法在语句triggersDDL上创建DML,但在here 的某些系统级语句中除外。只能在数据库的tables上创建触发器。在您的问题中,drop user <username>;是一个声明。

我引用:

  

使用DROP USER语句删除数据库用户并可选   删除用户的对象。

     

当您删除用户时,Oracle数据库也会清除该用户的所有内容   来自回收站的架构对象。

注意 - 鉴于您是否试图实际drop user或尝试drop名为user的自定义表格的混淆,以下是您的陈述会使用。

删除数据库用户 - drop user username [cascade];

删除名为user - drop table user [cascade constraints];

的表格

[ ]中的选项是可选的。