Oracleがutl_fileコマンドからアクセスできるOSディレクトリを制限する場合は、utl_file_dir
を設定できます。 パラメータ。残念ながら、このパラメータはシステム全体であるため、このパラメータを使用して特定のユーザーに付与/取り消すことはできません。また、このパラメータに変更を加えた場合、それらの変更はOracleデータベースが再起動されるまで有効にならないことに注意してください。
alter system set utl_file_dir = '/foo/bar' scope=spfile;
shutdown immediate;
startup open;
12.1Oracleドキュメントを参照してください
utl_file_dir
の詳細については 。
とは言うものの、Oracleディレクトリを作成できるユーザーを特定のOSディレクトリに本当に制限したい場合は、そのタスクに適した手順です。これにより、よりきめ細かい制御が可能になります(そして、非常に強力なcreate any directory
プロシージャの所有者への特権):
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.