Ограничить на уровне пользователя оракула триггера - PullRequest
0 голосов
/ 29 августа 2018

Этот триггер работает нормально и ограничивает 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;

Но этот триггер применен ко всей базе данных. Я хочу применить его к выбранным пользователям, пожалуйста, поделитесь тем, что поможет.

1 Ответ

0 голосов
/ 29 августа 2018

Скажем, вы хотите добавить ограничение тем же способом для пользователя, который подключается к базе данных для этого изменения, вы бы сделали аналогичный триггер и добавили к нему условие:

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', от пользователей ОС Alex и Hales).

...