アプリ版:「スタンプのみでお礼する」機能のリリースについて

初心者です。失礼のないように努力いたしますのでご協力お願いいたします。

ログオントリガーを使用して接続者の制限をしたいのですが正常に動作しません。

CREATE OR REPLACE TRIGGER LOGON_TRG AFTER LOGON ON DATABASE
DECLARE
STR_SCHEMANAMEVARCHAR2(20);
STR_OSUSERVARCHAR2(20);
STR_PROGRAMVARCHAR2(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
INSERTINTOALOG (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に権限的なものが必要なのでしょうか?
(いろいろと調べてみましたが特に権限での制限は見当たりませんでした)

何か要因に思い当たる方がいらっしゃいましたらご協力いただければと思います。
よろしくお願いいたします。

A 回答 (2件)

このリンク先の解説ですが、エラーを発生させて処理を中断させることが目的で、故にログオンも中断されるという理屈だけですねー。


これまずいし、ログオンとトリガーは別プロセスなので確実にログオンがキャンセルされるとは思いにくいのですが?すべてのバージョンで稼働確認しての説明なんでしょうか?
いま環境がないので試せませんが、エラー処理には例外処理をつけるのがマナーなので、例外処理の中で例外を実行させてきちんと処理を終わらせるのが正しいはずです。リンク先のは中断を目的にしてますからね。
http://www.shift-the-oracle.com/plsql/exception/ …
ここで例外を学んで、例外処理として、ログの作成、ログインの切断を入れてみてください。
まあ試しに例外を起こす前に切断させても実験にはなりますが?
    • good
    • 0

記録はしているがセッションを切る処理が見つからないですが??


ログイン後のトリガーですからログインはされた後と言う意味です。ですから一度つながったセッションを切ってやる方法しかないと思いますよ。

execute immediate 'dbms_service.disconnect_session(''USER1'')';

この回答への補足

早速のご回答ありがとうございます。

↓このように記載されているため
http://www.istudy.ne.jp/training/serial/plsql/07 …

RAISE_APPLICATION_ERROR はユーザーにエラーを通知し処理終了(セッションは切れる)と
思っていたのですが、セッションを切るアクションが必要でしょうか?
ちなみに、RAISE_APPLICATION_ERROR の後に処理を加えても以降の処理はされません。
教えていただいた セッションを切るアクションはRAISE_APPLICATION_ERRORの前にしなくて
はいけないということでしょうか?

補足日時:2014/08/12 13:09
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!