【问题标题】:Restrict on the user level oracle trigger限制用户级别的 oracle 触发器
【发布时间】: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') 这个触发器永远不会允许任何人创建任何东西,因为AlexHales 都包含大写字母...当您说要限制某些用户时,您的意思是模式?您是否尝试过在触发器正文中添加对模式的检查?
  • 此外,您应该删除数据库触发器中的commit。顺便说一句,不需要引用dual,而使用v_osuser := sys_context('userenv', 'os_user')就足够了。
  • 是的,我想限制某些用户意味着模式。
  • 不,我没有尝试在架构上添加检查
  • @BarbarosÖzhan - 触发器需要 COMMIT,因为它使用 pragma autonomous transaction 登录审计表。

标签: database oracle plsql triggers database-trigger


【解决方案1】:

假设您想以相同的方式为连接到数据库的用户添加一个约束以进行该更改,您将执行类似的触发器,并在其上添加一个条件:

create or replace trigger TRG_Restrict
before create on database
DECLARE
  v_osuser varchar(500);
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  v_osuser := sys_context('userenv', 'os_user') ;
  -- condition on OS user
  if (lower(v_osuser) not in ( 'alex','hales')) then
    -- condition on user connected to Oracle
    if (ora_login_user not in ('SYS', 'OKTOMODIFY_USER1', 'OKTOMODIFY_USER2') ) 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 if;
END;

(这里假设 可以修改仅连接到 Oracle 为 'SYS'、'OKTOMODIFY_USER1' 和 'OKTOMODIFY_USER2' ,来自 OS 用户 AlexHales)。

【讨论】:

  • 一般的解决方法是正确的,但是白名单是错误的。例如,这会破坏作为 SYSTEM 连接的会话。当然在 12c 或更高版本中,check DBA_USERS and allow users marked as ORACLE_MAINTAINED 会更好。
  • 更一般地说,正如我对这个问题的评论,这种方法是不必要的。 Oracle 提供了直接管理用户权限的方法,无需构建脆弱的触发器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
相关资源
最近更新 更多