oracle directory - ghdrako/doc_snipets GitHub Wiki

In Oracle Database, a directory is a database object that serves as a pointer to a physical directory on the server’s file system. It's mainly used for file operations like reading from or writing to external files via Oracle features such as:

  • External tables
  • Data Pump (import/export)
  • UTL_FILE package

Create directory

CREATE OR REPLACE DIRECTORY my_dir AS '/path/to/your/folder';

Granting Permissions

GRANT READ, WRITE ON DIRECTORY my_dir TO your_user;
  • Tylko użytkownicy z przydzielonymi uprawnieniami READ, WRITE (i opcjonalnie EXECUTE) mogą używać danego katalogu.
  • Brak roli PUBLIC domyślnie – musisz jawnie przydzielić uprawnienia:

Brak kontroli uprawnień na poziomie systemu operacyjnego

  • Jeśli Oracle ma dostęp do katalogu w systemie (z poziomu konta Oracle OS), użytkownik w bazie z przydzielonym WRITE może nadpisać plik.
  • Nie ma "sandboxa" – katalogi mogą wskazywać na dowolny folder (nawet wrażliwy), jeśli tylko Oracle ma tam dostęp.

Use Case: UTL_FILE

DECLARE
  f UTL_FILE.FILE_TYPE;
BEGIN
  f := UTL_FILE.FOPEN('MY_DIR', 'test.txt', 'W');
  UTL_FILE.PUT_LINE(f, 'Hello, Oracle directory!');
  UTL_FILE.FCLOSE(f);
END;

Use Case: Data Pump (expdp/impdp

Musisz użyć DIRECTORY do określenia lokalizacji dumpa:

expdp user/password DIRECTORY=my_dir DUMPFILE=export.dmp LOGFILE=export.log

Notes

  • The OS path must already exist and be accessible by the Oracle user (the system-level user that runs the Oracle DB).
  • Directories are database objects — you can see them using:
SELECT * FROM ALL_DIRECTORIES;
SELECT * FROM USER_DIRECTORIES;
SELECT * FROM DBA_DIRECTORIES;

Uprawnienia

SELECT * 
FROM DBA_TAB_PRIVS 
WHERE TABLE_NAME IN (SELECT DIRECTORY_NAME FROM DBA_DIRECTORIES);

Info

  • Oracle nie pozwala na operacje na katalogach z poziomu SQL
    • Nie możesz np. sprawdzić, czy plik istnieje – musisz użyć pakietów PL/SQL (np. UTL_FILE.FGETATTR lub DBMS_LOB.FILEEXISTS dla BFILE).
    • Oracle nie wspiera ls, mkdir, rm w stylu Linuxa – potrzebne są zewnętrzne skrypty lub rozszerzenia (np. Java w Oracle).
  • Można utworzyć wiele katalogów wskazujących na ten sam folder
    • Nazwy są unikalne w obrębie bazy, ale mogą wskazywać ten sam DIRECTORY_PATH.