UTL_FILE を使ってファイル出力を行うプロシージャをテストする場合、ファイルのオープンエラーをテストするために「書き込み権限がないファイルが存在した場合...」なんていうテストケースを作成することがある。
Windows 環境の場合、過度に厳格な権限設定を行っていなければ”読み取り専用”属性付けたファイルを置いてファイル出力する程度のテストで済ませてしまうのだが、 UNIX や Linux の場合はほぼ権限の問題が絡んでくること間違いなしなのでややこしい。
先日、Linux 環境にて上記のようなテストケースをテストしていて妙な現象に出くわしました。
Linux では Oracle インスタンスを実行するシャドウ・プロセスが存在し、その所有者は通常 "oracle" というユーザーです。
つまり、UTL_FILE で作成したファイルは "oracle" が所有することになります。
そこで、別のユーザーが所有し、その他のユーザーに書き込み権限を与えていないファイル(u=rw,g=rw,o=r)を置いて、ファイル出力時におけるファイルのオープンエラーを試してみたのですが、(クライアントから)Oracle Net 経由で接続して実行するとオープンエラー(INVALID_OPERATION)が発生するのに、(サーバー上で)ローカル接続して実行するとオープンエラーが発生しないのです。
つまり、sqlplus username/password@connect_identifier で接続するとエラーとなるのに、sqlplus username/password で接続するとエラーにならないのです。
しかし、このとき sqlplus を実行したユーザーはファイルの所有者だったのですが、これを "oracle" に変えて実行してみるとどちらもエラーにならなくなりました。
これらの現象から推測するに、どうも sqlplus を実行したユーザーでファイルの権限をチェックをしているということのようです...
(そのくせ、出力されるファイルの所有者は必ず "oracle" なのですが...)
これが ORACLE の仕様によるものなのか、OS の仕様によるものなのかはよくわかりませんが、注意が必要です。
【関連エントリ】
[Oracle] テキストファイルの入出力方法 2004/07/14
[Oracle] Linux環境でのUTL_FILEの不思議な挙動 2007/01/16
[Oracle] UTL_FILE.PUT_LINE で書き出される改行コードがおかしい! 2007/01/17
[Oracle] UTL_FILE.GET_LINE で改行コードの一部が読み込まれる! 2007/01/18
[Oracle] UTL_FILE でキャラクタ・セットを変換して読み書きする(1) 2007/02/21
[Oracle] UTL_FILE でキャラクタ・セットを変換して読み書きする(2) 2007/02/27