Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle Come concedere CREATE ANY DIRECTORY con la restrizione che tutte le directory devono essere create all'interno di una determinata directory?

Dipende, se vuoi limitare le directory del sistema operativo a cui Oracle può accedere dai comandi utl_file, puoi impostare utl_file_dir parametro. Sfortunatamente, questo parametro è a livello di sistema, quindi non sarai in grado di concedere/revocare per un utente specifico che utilizza questo parametro. Tieni inoltre presente che se apporti modifiche a questo parametro, tali modifiche non avranno effetto fino al riavvio del database Oracle:

alter system set utl_file_dir = '/foo/bar' scope=spfile;
shutdown immediate;
startup open;

Consulta il 12.1 Oracle Docs per ulteriori informazioni su utl_file_dir .

Detto questo, se vuoi davvero limitare chi può creare directory Oracle a specifiche directory del sistema operativo, una procedura sarebbe appropriata per quell'attività poiché ciò ti consentirebbe di avere un controllo più dettagliato (e limitare chi ha il potentissimo create any directory privilegio al titolare della procedura):

sqlplus kjohnston

create or replace procedure mydircreate (p_dir varchar2)
as
  ex_custom EXCEPTION;
  PRAGMA EXCEPTION_INIT( ex_custom, -20001 );
begin
  if lower(p_dir) not like '/foo/bar/%' then
    raise_application_error( -20001, 'Not authorized' );
  end if;

  execute immediate 'create or replace directory mydir as ''' || p_dir || '''';
end mydircreate;

create user testuser identified by <password>;
grant create session to testuser;
grant execute on kjohnston.mydircreate to testuser;

exit;

sqlplus testuser

SQL> exec kjohnston.mydircreate('mydir', '/randomdir');
ORA-20001: Not authorized

SQL> exec kjohnston.mydircreate('mydir', '/foo/bar/baz');
PL/SQL procedure successfully completed.