2

可以在删除用户事件时创建触发器吗?如果是这样,我该如何编写触发器 - * 我想在删除用户后从表中删除与该用户相关的一些行 *

“删除用户”

你能提供一个例子:

如果用户是 drop 并且 oracle 清除了用户的模式对象,我仍然可以选择要保留或删除的数据行吗?

那么您是说不能在删除用户事件时创建触发器吗?

4

2 回答 2

2

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

您正在寻找系统触发器,而不是模式触发器或数据库触发器。您可以将这些添加到大量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程序,可以在一个地方完成您想要的所有事情,而不是在触发器中隐藏逻辑,那会更好。

于 2012-08-24T07:41:04.257 回答
0

您不能创建triggerson 语句(DDLDML除了在此处找到的某些系统级语句)。触发器只能在tables数据库上创建。在你的问题中,drop user <username>;是一个声明。

我引用:

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

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

注意 - 考虑到您是尝试实际drop使用user还是尝试使用drop名为 的自定义表user,以下是您将使用的语句。

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

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

中的选项[ ]是可选的。

于 2012-08-24T00:44:18.007 回答