Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle Como conceder CREATE ANY DIRECTORY com a restrição de que todos os diretórios devem ser criados dentro de um determinado diretório?


Isso depende, se você quiser restringir quais diretórios de SO o Oracle pode acessar a partir de comandos utl_file, você pode definir o utl_file_dir parâmetro. Infelizmente, esse parâmetro abrange todo o sistema, portanto, você não poderá conceder/revogar para um usuário específico usando esse parâmetro. Lembre-se também de que, se você fizer alterações nesse parâmetro, essas alterações não entrarão em vigor até que o banco de dados Oracle seja reiniciado:
alter system set utl_file_dir = '/foo/bar' scope=spfile;
shutdown immediate;
startup open;

Consulte o 12.1 Oracle Docs para mais informações sobre utl_file_dir .

Dito isso, se você realmente deseja restringir quem pode criar diretórios Oracle para diretórios específicos do sistema operacional, um procedimento seria apropriado para essa tarefa, pois isso permitiria que você tivesse um controle mais refinado (e limitaria quem tem o poderoso create any directory privilégio ao titular do procedimento):
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.