- 締切済み
ORACLE ログオントリガーで接続制限
初心者です。失礼のないように努力いたしますのでご協力お願いいたします。 ログオントリガーを使用して接続者の制限をしたいのですが正常に動作しません。 CREATE OR REPLACE TRIGGER LOGON_TRG AFTER LOGON ON DATABASE DECLARE STR_SCHEMANAME VARCHAR2(20); STR_OSUSER VARCHAR2(20); STR_PROGRAM VARCHAR2(20); BEGIN SELECT USERNAME,OSUSER,PROGRAM INTO STR_SCHEMANAME,STR_OSUSER,STR_PROGRAM FROM V$SESSION WHERE audsid = USERENV('SESSIONID'); IF STR_SCHEMANAME = 'SCH1' AND STR_OSUSER = 'USER1' THEN INSERT INTO ALOG (SCHEMANAME,OSUSER,LOGIN_DAT,PROGRAM)VALUES(STR_SCHEMANAME,STR_OSUSER,TO_DATE(TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS'),'YYYY/MM/DD HH24:MI:SS'),STR_PROGRAM); COMMIT; RAISE_APPLICATION_ERROR(-20000, 'Can not login'); END IF; END LOGON_TRG; <説明> スキーマ='SCH1'にOSユーザー=’USER1’が接続してきたらALOGに情報を記録して接続しない。 このトリガーはSYSで登録しています。 <結果> スキーマ='SCH1'にOSユーザー=’USER1’で接続するとALOGに記録はするのですが、 エラーメッセージが表示されず正常に接続できてしまいます。 <質問> ○RAISE_APPLICATION_ERRORがなぜ正常に動作しないのかがわかりません。 ○RAISE_APPLICATION_ERRORに権限的なものが必要なのでしょうか? (いろいろと調べてみましたが特に権限での制限は見当たりませんでした) 何か要因に思い当たる方がいらっしゃいましたらご協力いただければと思います。 よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- IDii24
- ベストアンサー率24% (1597/6506)
このリンク先の解説ですが、エラーを発生させて処理を中断させることが目的で、故にログオンも中断されるという理屈だけですねー。 これまずいし、ログオンとトリガーは別プロセスなので確実にログオンがキャンセルされるとは思いにくいのですが?すべてのバージョンで稼働確認しての説明なんでしょうか? いま環境がないので試せませんが、エラー処理には例外処理をつけるのがマナーなので、例外処理の中で例外を実行させてきちんと処理を終わらせるのが正しいはずです。リンク先のは中断を目的にしてますからね。 http://www.shift-the-oracle.com/plsql/exception/raise_application_error.html ここで例外を学んで、例外処理として、ログの作成、ログインの切断を入れてみてください。 まあ試しに例外を起こす前に切断させても実験にはなりますが?
- IDii24
- ベストアンサー率24% (1597/6506)
記録はしているがセッションを切る処理が見つからないですが?? ログイン後のトリガーですからログインはされた後と言う意味です。ですから一度つながったセッションを切ってやる方法しかないと思いますよ。 execute immediate 'dbms_service.disconnect_session(''USER1'')';
補足
早速のご回答ありがとうございます。 ↓このように記載されているため http://www.istudy.ne.jp/training/serial/plsql/071.html RAISE_APPLICATION_ERROR はユーザーにエラーを通知し処理終了(セッションは切れる)と 思っていたのですが、セッションを切るアクションが必要でしょうか? ちなみに、RAISE_APPLICATION_ERROR の後に処理を加えても以降の処理はされません。 教えていただいた セッションを切るアクションはRAISE_APPLICATION_ERRORの前にしなくて はいけないということでしょうか?