可以在删除用户事件时创建触发器吗?如果是这样,我该如何编写触发器 - * 我想在删除用户后从表中删除与该用户相关的一些行 *
“删除用户”
你能提供一个例子:
如果用户是 drop 并且 oracle 清除了用户的模式对象,我仍然可以选择要保留或删除的数据行吗?
那么您是说不能在删除用户事件时创建触发器吗?
当然可以。假设您实际上是删除用户而不是表:
您正在寻找系统触发器,而不是模式触发器或数据库触发器。您可以将这些添加到大量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_user
和create_user
程序,可以在一个地方完成您想要的所有事情,而不是在触发器中隐藏逻辑,那会更好。
您不能创建triggers
on 语句(DDL
或DML
,除了在此处找到的某些系统级语句)。触发器只能在tables
数据库上创建。在你的问题中,drop user <username>;
是一个声明。
我引用:
使用 DROP USER 语句删除数据库用户并可选择删除用户的对象。
当您删除一个用户时,Oracle 数据库还会从回收站中清除该用户的所有模式对象。
注意 - 考虑到您是尝试实际drop
使用user
还是尝试使用drop
名为 的自定义表user
,以下是您将使用的语句。
要删除数据库用户 -drop user username [cascade];
要删除名为 user 的表 -drop table user [cascade constraints];
中的选项[ ]
是可选的。