Das hängt davon ab, ob Sie einschränken möchten, auf welche Betriebssystemverzeichnisse Oracle über utl_file-Befehle zugreifen kann, Sie können das utl_file_dir
festlegen Parameter. Leider ist dieser Parameter systemweit, sodass Sie mit diesem Parameter einem bestimmten Benutzer keine Gewährung/Aufhebung erteilen können. Denken Sie auch daran, dass Änderungen an diesem Parameter erst wirksam werden, wenn die Oracle-Datenbank neu gestartet wird:
alter system set utl_file_dir = '/foo/bar' scope=spfile;
shutdown immediate;
startup open;
Konsultieren Sie die 12.1 Oracle Docs
für weitere Informationen zu utl_file_dir
.
Wenn Sie jedoch wirklich einschränken möchten, wer Oracle-Verzeichnisse auf bestimmte Betriebssystemverzeichnisse erstellen kann, wäre ein Verfahren für diese Aufgabe geeignet, da Sie damit eine feinkörnigere Kontrolle haben (und einschränken können, wer den sehr mächtigen create any directory
Privileg für den Eigentümer der Prozedur):
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.