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.