
初心者です。失礼のないように努力いたしますのでご協力お願いいたします。
ログオントリガーを使用して接続者の制限をしたいのですが正常に動作しません。
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件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
このリンク先の解説ですが、エラーを発生させて処理を中断させることが目的で、故にログオンも中断されるという理屈だけですねー。
これまずいし、ログオンとトリガーは別プロセスなので確実にログオンがキャンセルされるとは思いにくいのですが?すべてのバージョンで稼働確認しての説明なんでしょうか?
いま環境がないので試せませんが、エラー処理には例外処理をつけるのがマナーなので、例外処理の中で例外を実行させてきちんと処理を終わらせるのが正しいはずです。リンク先のは中断を目的にしてますからね。
http://www.shift-the-oracle.com/plsql/exception/ …
ここで例外を学んで、例外処理として、ログの作成、ログインの切断を入れてみてください。
まあ試しに例外を起こす前に切断させても実験にはなりますが?
No.1
- 回答日時:
記録はしているがセッションを切る処理が見つからないですが??
ログイン後のトリガーですからログインはされた後と言う意味です。ですから一度つながったセッションを切ってやる方法しかないと思いますよ。
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の前にしなくて
はいけないということでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- その他(プログラミング・Web制作) Python - Excel で Webからデータを連続取得したいのですが エラーが出ます 1 2023/07/06 20:08
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Edgeでオフラインとは?
-
先日からDigiBestTVで「デバイ...
-
飛んできたH画像
-
有料アダルトサイトについて
-
スーパーセキュリティZEROで下...
-
FFFTPにて「受信はタイムアウト...
-
PCでGoogle Chromeでネット接続...
-
Firefoxのグーグル検索で表示さ...
-
ファイヤーフォックスが接続で...
-
Cyberduckでエラーが出てしまう
-
iPhoneのSafariでサイトを閲覧...
-
インターネットエクスプローラ...
-
FTP接続について URLでサイトを...
-
アメリカから日本のサイトが見...
-
通常と異なるトラフィック
-
USB-MPGとUSB接続バーンプル-...
-
2台のPC間でpingが通らない。ご...
-
ブラウザの変更方法
-
I phone8からある一定のサイト...
-
iTunes、Windows Media Player...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
会社PCのメールが更新されない
-
スーパーセキュリティZEROで下...
-
先日からDigiBestTVで「デバイ...
-
teratermでLinuxに接続できません
-
ORCADでのページ追加のやり方
-
Windows10から11に更新しました...
-
マイメニューってなんですか?
-
特定のサーバーにだけFTP接...
-
Cyberduckでエラーが出てしまう
-
Microsoftアカウントのサインイ...
-
Win11でブラウザでのネットブラ...
-
Firefoxのグーグル検索で表示さ...
-
マイナポータル
-
FFFTPにて「受信はタイムアウト...
-
MS-DOS 版の Teraterm?
-
ftpサーバに接続できない
-
μTorrentでの特定者の接続拒否...
-
MSNメッセンジャーの「.NET Mes...
-
デスクネッツに社外PCからアク...
-
「TeamViewer」というソフトを...
おすすめ情報