sql >> Base de Datos >  >> RDS >> Oracle

Oracle ¿Cómo otorgar CREATE ANY DIRECTORY con la restricción de que todos los directorios deben crearse dentro de un directorio determinado?

Eso depende, si desea restringir a qué directorios del sistema operativo puede acceder Oracle desde los comandos utl_file, puede establecer el utl_file_dir parámetro. Desafortunadamente, este parámetro es para todo el sistema, por lo que no podrá otorgar/revocar para un usuario específico usando este parámetro. También tenga en cuenta que si realiza cambios en este parámetro, esos cambios no entrarán en vigencia hasta que se reinicie la base de datos de Oracle:

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

Consulte la 12.1 Oracle Docs para obtener más información sobre utl_file_dir .

Dicho esto, si realmente desea restringir quién puede crear directorios de Oracle a directorios de sistemas operativos específicos, un procedimiento sería apropiado para esa tarea, ya que le permitiría tener un control más detallado (y limitar quién tiene el poderoso create any directory privilegio al propietario del procedimiento):

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.