是否可以在drop user事件中创建触发器?如果是这样,我该怎么写触发器 - *我想在删除用户*
后从表中删除与该用户相关的一些行“删除用户”
你能提供一个例子:
如果用户是drop并且oracle清除了用户的架构对象,那么我可以选择要保留或删除的数据行吗?
您是说在删除用户事件时无法创建触发器?
答案 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_user
和create_user
过程的程序包,可以在一个地方执行您想要的任何操作,而不是伪装触发器中的逻辑,那会更好。
答案 1 :(得分:0)
您无法在语句triggers
或DDL
,上创建DML
,但在here 的某些系统级语句中除外。只能在数据库的tables
上创建触发器。在您的问题中,drop user <username>;
是一个声明。
我引用:
使用DROP USER语句删除数据库用户并可选 删除用户的对象。
当您删除用户时,Oracle数据库也会清除该用户的所有内容 来自回收站的架构对象。
注意 - 鉴于您是否试图实际drop
user
或尝试drop
名为user
的自定义表格的混淆,以下是您的陈述会使用。
删除数据库用户 - drop user username [cascade];
删除名为user - drop table user [cascade constraints];
[ ]
中的选项是可选的。