To záleží, pokud chcete omezit, ke kterým adresářům OS může Oracle přistupovat z příkazů utl_file, můžete nastavit utl_file_dir
parametr. Bohužel je tento parametr celosystémový, takže pomocí tohoto parametru nebudete moci udělit/odvolat pro konkrétního uživatele. Také mějte na paměti, že pokud provedete změny tohoto parametru, tyto změny se neprojeví, dokud nebude databáze Oracle restartována:
alter system set utl_file_dir = '/foo/bar' scope=spfile;
shutdown immediate;
startup open;
Nahlédněte do 12.1 Oracle Docs
pro více informací o utl_file_dir
.
To znamená, že pokud opravdu chcete omezit, kdo může vytvářet adresáře Oracle na konkrétní adresáře OS, byl by pro tento úkol vhodný postup, protože by vám umožnil mít jemnější kontrolu (a omezit, kdo má velmi výkonný create any directory
oprávnění vlastníka procedury):
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.