Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle Wie kann CREATE ANY DIRECTORY mit der Einschränkung gewährt werden, dass alle Verzeichnisse in einem bestimmten Verzeichnis erstellt werden müssen?

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.