sql >> Databáze >  >> RDS >> Oracle

Oracle Jak udělit CREATE ANY DIRECTORY s omezením, že všechny adresáře musí být vytvořeny v daném adresáři?

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.


  1. Získejte MAX ze skupiny GROUP BY

  2. Jak zkopírovat řádek z jedné tabulky serveru SQL Server do druhé

  3. Jak navrhnout MySql tabulku pro Tag Cloud?

  4. Nelze vygenerovat rozdíl oproti pluginu liquibase gradle