【发布时间】:2023-03-30 00:20:01
【问题描述】:
此触发器工作正常并限制 os_users
create or replace trigger TRG_Restrict
before create on database
DECLARE
v_osuser varchar(500);
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
select sys_context('userenv', 'os_user') into v_osuser from dual;
if (lower(v_osuser) not in ( 'alex','hales')) then
insert into TEMP_AUDIT_users
(ddl_date,
user_name,
ddl_type,
object_type,
object_name,
owner,
osuser,
host,
terminal,
IP_address)
VALUES
(sysdate,
ora_login_user,
ora_sysevent,
ora_dict_obj_type,
ora_dict_obj_name,
ora_dict_obj_owner,
v_osuser,
sys_context('USERENV', 'HOST'),
sys_context('USERENV', 'TERMINAL'),
SYS_CONTEXT('USERENV','IP_ADDRESS'));
commit;
begin
RAISE_APPLICATION_ERROR
(-20000,'Stop You Are Not Authorized To Make Any Change. Thank You :(
');
end;
end if;
end;
但是这个触发器应用于整个数据库,我想将它应用于选定的用户,请分享一些有用的东西。
【问题讨论】:
-
lower(v_osuser) not in ( 'Alex','Hales')这个触发器永远不会允许任何人创建任何东西,因为Alex和Hales都包含大写字母...当您说要限制某些用户时,您的意思是模式?您是否尝试过在触发器正文中添加对模式的检查? -
此外,您应该删除数据库触发器中的
commit。顺便说一句,不需要引用dual,而使用v_osuser := sys_context('userenv', 'os_user')就足够了。 -
是的,我想限制某些用户意味着模式。
-
不,我没有尝试在架构上添加检查
-
@BarbarosÖzhan - 触发器需要 COMMIT,因为它使用
pragma autonomous transaction登录审计表。
标签: database oracle plsql triggers database-trigger