Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle Comment accorder CREATE ANY DIRECTORY avec la restriction que tous les répertoires doivent être créés dans un répertoire donné ?

Cela dépend, si vous souhaitez restreindre les répertoires du système d'exploitation auxquels Oracle peut accéder à partir des commandes utl_file, vous pouvez définir le utl_file_dir paramètre. Malheureusement, ce paramètre s'applique à l'ensemble du système, vous ne pourrez donc pas accorder/révoquer un utilisateur spécifique à l'aide de ce paramètre. Gardez également à l'esprit que si vous apportez des modifications à ce paramètre, ces modifications n'entreront en vigueur qu'au redémarrage de la base de données Oracle :

alter system set utl_file_dir = '/foo/bar' scope=spfile;
shutdown immediate;
startup open;

Consultez la 12.1 Oracle Docs pour plus d'informations concernant utl_file_dir .

Cela dit, si vous voulez vraiment restreindre qui peut créer des répertoires Oracle à des répertoires de système d'exploitation spécifiques, une procédure serait appropriée pour cette tâche car cela vous permettrait d'avoir un contrôle plus fin (et de limiter qui a le très puissant create any directory privilège au propriétaire de la procédure) :

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.