Oracle: 创建删除用户的触发器。

3

在删除用户事件上能否创建触发器?如果可以,我应该如何编写触发器 - * 我想在删除用户后从表中删除与该用户相关的某些行 *

“删除用户”

你能提供一个例子吗:

如果用户被删除并且 Oracle 清除了用户模式对象,有没有办法可以选择要保留或删除的数据行?

那么您是说无法在删除用户事件上创建触发器吗?


@codingbiz 你不能使用 delete 语句来删除用户,数据库用户只能通过使用 drop 语句来删除。delete 语句用于从数据库表中删除行。 - Anjan Biswas
哦!现在我明白了。我被提问者的问题搞糊涂了。 - codingbiz
2个回答

3
当然可以。假设你要删除的是一个用户而不是一个表:
你需要寻找一个系统触发器,而不是模式触发器或数据库触发器。你可以将这些触发器添加到许多DDL事件中,包括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;
/

这段文字的意思是:使用文档不太全面的dbms_standard包来确定正在发生的事情。在我看来,PSOUG有更好的文档
如果您只想对特定模式而不是整个数据库执行此操作,请改用before drop on schema
只是补充一下,我不确定需要在触发器中这样做。最好创建一个包,其中包含 drop_usercreate_user 过程,在一个地方完成所有操作,而不是将逻辑伪装为触发器中的操作。

这是非常糟糕的建议。使用未记录的功能,你基本上是自己一个人。在下一个版本中,这些功能可能不再可用,甚至Oracle支持也无法帮助你。 - steve
@steve,我的建议是不要使用触发器,而是创建一个包。我也回答了这个问题;仅仅因为某种方法不一定是做某事的最佳方式,并不意味着提问者实际上不需要答案。通过提出更好的方法,我还可以引起他们对其他可能性的注意。 - Ben

0

你不能在语句(DDL或DML,除了一些系统级语句,可以在这里找到here)上创建触发器。触发器只能在数据库的表上创建。在你的问题中,drop user <username>;是一个语句。

我引用:

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

当你删除一个用户时,Oracle数据库还会从回收站中清除该用户的所有模式对象。

注意-鉴于你是否真正尝试drop一个user还是尝试drop一个名为user的自定义表的混淆,下面是你将使用的语句。

要删除一个DB用户- drop user username [cascade];

删除名为user的表 - drop table user [cascade constraints]; [ ]中的选项是可选的。

是的,但数量有限,我没有看到可以用于用户语句如 dropdelete 的一个。 - Anjan Biswas
是的,我同意。有DML触发器和系统触发器,两者对于DROP USER命令都没有用处。当然,目前并不太清楚操作者实际上是否指的是DROP USER,或者他们正在处理一张自定义的"USER"表,并从中删除记录。 - Glenn
无论如何,都无法在“drop user”或“drop table”上创建触发器(虽然这对于数据库管理员来说将是一个巨大的工具)。 - Anjan Biswas
1
你完全错了。你可以在几乎任何事件上创建数据库级、系统级和模式级触发器。请参考这个链接 - Ben
@Annjawn,我的回答:-),还有这个ask tom article;我建议使用表格而不是用户来完成。你在谈论数据库触发器,而不是系统触发器。 - Ben
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接