• 締切済み

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に権限的なものが必要なのでしょうか? (いろいろと調べてみましたが特に権限での制限は見当たりませんでした) 何か要因に思い当たる方がいらっしゃいましたらご協力いただければと思います。 よろしくお願いいたします。

みんなの回答

  • IDii24
  • ベストアンサー率24% (1597/6506)
回答No.2

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

  • IDii24
  • ベストアンサー率24% (1597/6506)
回答No.1

記録はしているがセッションを切る処理が見つからないですが?? ログイン後のトリガーですからログインはされた後と言う意味です。ですから一度つながったセッションを切ってやる方法しかないと思いますよ。 execute immediate 'dbms_service.disconnect_session(''USER1'')';

gootama_bao
質問者

補足

早速のご回答ありがとうございます。 ↓このように記載されているため http://www.istudy.ne.jp/training/serial/plsql/071.html RAISE_APPLICATION_ERROR はユーザーにエラーを通知し処理終了(セッションは切れる)と 思っていたのですが、セッションを切るアクションが必要でしょうか? ちなみに、RAISE_APPLICATION_ERROR の後に処理を加えても以降の処理はされません。 教えていただいた セッションを切るアクションはRAISE_APPLICATION_ERRORの前にしなくて はいけないということでしょうか?

関連するQ&A

  • Administratorsとしてログオンできません。

    OSはWindows2000ですが、WindowsUpdateしようとすると、[エラー番号: 0x8DDD0002] がでてきてしまいます。すなわち、「管理者または Administrators グループのメンバとしてログオンする必要があります」というのです。同様に、ある英語のソフト(辞書)を立ち上げようとすると、“NT users should longon with Administrator rights and run this application again.”というのが出てきてしまいます。 しかし、私はAdministratorとしてログオンしているつもりなのです。どうしたら、よいのでしょうか。 実は心当たりがあって、デーモンバスター 1.03(DBuster.exe)というフリーソフトを導入してちょっといじってしまい、Net Logonというのが自動的に開始しないようにしてしまったのです。(元に戻そうとしても、うまくいかない) 誰かアドバイスお願いします。

  • Common SQLでOracle DBに接続できません

    Common SQLでDB接続エラーとなり接続できません。 「ORA-01017:invalid username/password; logon denied」 というエラーメッセージが表示されます。 ユーザー名・パスワードは間違っていません(SQL plusでは接続 できたので) 他になにか設定しなければいけないところがあるのでしょうか? ご存知の方、教えてください。 よろしくお願いします。

  • PostgreSQL 接続プール数について

    vb.netよりPostgreSQLに接続すると以下のエラーが表示されました。 【エラー】 The connection pool has been exhausted, either raise MaxPoolSize(100) or Timeout(currently 15 seconds) 接続ユーザ数は、3ユーザぐらいなのですが、なぜこのようなエラーが出るのでしょうか? どなたかお詳しい方がいらっしゃいましたら、ご教授頂ければ、助かります。 宜しくお願い致します。

  • VB.NET Oracle接続 32、64bit

    VB.NET 2010でOracle11gに接続するプログラムを作っていますが、 接続方法がいまいちわからずに困っています。 プログラムを動かすサーバーはWindows Server 2008 R2の64bitだったので、 Oracle Clientも合わせた方がいいのかなと思い、64bit版をインストールしました。 ASP.NETのWEBアプリでは以下の接続文字列を用いてADO接続できました。 パラメータ値は例です。 (Web.configに記述) <connectionStrings> <add name="oracle" connectionString="Provider=OraOLEDB.Oracle;Data Source=db1;Password=pass1;User ID=user1" providerName="System.Data.OleDb" /> </connectionStrings> 次に、コンソールプログラムを作成し、同じサーバーで上記と同様の接続文字列で 接続しようとしましたが、エラーとなり接続できませんでした。 いろいろ記述を変えても接続できませんでしたが、最終的にOracle Clientの 32bit版を64bit版と違うフォルダにインストールし、以下の接続文字列で接続 できました。(INIファイルに記載) ConnectionString=Provider=OraOLEDB.Oracle;Data Source=db1;Password=pass1;User ID=user1 この状態でWEBアプリの方は何を使っているのかと思い、64bit版のインストールフォルダを リネームしたところ、WEBアプリの方は接続できなくなりました。 現状では32bitと64bitのOracle Clientが両方必要な状況ですが、本来ならどちらかだけで すむと思います。 32bitと64bitで接続文字列が変わるという情報は得られませんでした。 何がまずいのでしょうか? 最初から32bit版をインストールすれば良かったのでしょうか。

  • 3階層上のファイルからimportしたい。(修正)

    2022/08/10 12:46 次のようなファイルディレクトリを想定します。 例えばfile.pyは a/ab/abb/file.pyとたどります。 a,aa,aba,b,ba,cなどはディレクリです。 今、file.pyから c内のtrg.py内の関数funcをimportするとします。 これを相対パスで指定する方法がわかりません。 +--a +-- aa +-- trg4.py(funcがある) +-- ab +--aba +-- trg2.py(funcがある) +--abb +-- file.py(実行するプログラム) +-- trg1.py(funcがある) +--trg3.py(funcがある) +--b +--ba +--bb +--c +--trg.py (目的のfuncがある。これをimportしたい) file.py から trg.pyをimportする方法として試したことは以下の通り。 from ./../../c.trg import func #syntax error 最初の'./'で。 from abb.trg1 import func #ok このように考えたのは file.py内で str = os.listdir('./../../') print(str) とすると3階層上の a, b, cがリストされたことから類推。 もうちょっとだと思うのですがわかりません。

  • excel vba のエラー原因が分かりません

    データ入力シート「Hit Data] データ表示シート「User Sheet」 とあります。 データ表示シート「User Sheet」に「次へ」「前へ」「最初へ」「最後へ」とボタンをつくり、データ入力シート「Hit Data]から、都度データを呼び出せるようにするプログラムをとあるサイトを参考にして作成しましたが、エラーが出てしまいどうしてもうまくいきません。 どこに問題があるのか見ていただけないでしょうか? '以下標準モジュールのプログラムです Public trg As Range Sub Saisyo()  Set trg = Worksheets("Hit Data").Range("A3")  Call Tenki End Sub Sub Saigo()  Set trg = Worksheets("Hit Data").Range("A60000").End(xlUp)  Call Tenki End Sub Sub Mae()  If trg.Row >= 4 Then   Set trg = trg.Offset(-1, 0)   Call Tenki  Else   MsgBox "これより前のレコードはありません"  End If End Sub Sub Tsugi()  If trg.Row < Worksheets("Hit Data").Range("A60000").End(xlUp).Row Then   Set trg = trg.Offset(1, 0)   Call Tenki  Else   MsgBox "これより後ろのレコードはありません"  End If End Sub Sub Tenki()  Worksheets("User Sheet").Range("D9").Value = trg.Offset(0, 0)  Worksheets("User Sheet").Range("D10").Value = trg.Offset(0, 1)  Worksheets("User Sheet").Range("D11").Value = trg.Offset(0, 2)  Worksheets("User Sheet").Range("D12").Value = trg.Offset(0, 3) End Sub '以下 User Sheet"のシートモジュールに記載されたプログラムです。 Private Sub Worksheet_Activate() Call Saisyo End Sub '表示されるエラーの内容 'saisyo・・・アプリケーション定義またはオブジェクト定義のエラーです。 'saigo・・・同上 'mae・・・オブジェクト変数またはWithブロック変数が設定されていません 'tugi・・・同上

  • C#でOracleに接続

    C#(2005)で作成したモジュールからOracle(10g)に接続する方法について質問です。 C# using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Configuration; using System.Collections; using System.Data.SqlClient; namespace ConsoleApplication1 { class Program { static void Main(string[] args) {    SqlConnection sqlcon = new SqlConnection("server=HOST名;database=ORA;user id=admin;password=admin"); SqlCommand sqlcmd = new SqlCommand("SELECT * FROM Table", sqlcon); sqlcon.Open();   ’ここでエラー’ SqlDataReader sqldr = sqlcmd.ExecuteReader(); while(sqldr.Read()){ Console.WriteLine((string)sqldr["ID"]); } sqldr.Close(); sqlcon.Close(); } } } エラー表示 SQL Server への接続を確立しているときにネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないかアクセスできません。インスタンス名が正しいこと、および SQL Server がリモート接続を許可するように構成されていることを確認してください。 (provider: 名前付きパイプ プロバイダ, error: 40 - SQL Server への接続を開けませんでした) 対処済み *「SQL+から「admin」「admin」「ORA」で接続確認。 *pingでホスト名 *C#よりデーターソースでのDBの接続 *SQLserverのセキュリティをリモート接続Ok->再起動済

  • VBからOracle接続が出来ません。

    こんにちは。 VisualBasic6.0EnterprizeEdition から Oracle8i の接続を試みております。 接続が出来ません。コードは本のものをそのまま書いたので、間違いはないと思います。 Private Function OraOPN() As Boolean Dim strDB As String * 30 'サービス名 Dim strUID As String * 30 'ユーザー名 Dim strPWD As String * 30 'パスワード Dim strUP As String Dim strMSG As String 'エラー時のメッセージ On Error GoTo Ora_Error strDB = Trim(txtLogon(2).Text) strUID = Trim(txtLogon(0).Text) strPWD = Trim(txtLogon(1).Text) strUP = strUID & "/" & strPWD strMSG = "データベースへの接続ができません" Set OraSession = CreateObject("OracleInProcServer.XOraSession") Set OraDatabase = OraSession.OpenDatabase(strDB, strUP, &H1&) OraOPN = True Exit Function Ora_Error: OraOPN = False Call MsgBox(strMSG & vbCrLf & " システム管理者に連絡してください" & vbCrLf & vbCrLf & "", vbCritical) End End Function 以上のコードで、接続できません。本に書いてあるとおりそのままのコードです。オラクルサーバとVBプログラムは同一マシン上に置いてあります。 私は、Java専門でVBはわかりません。誰かわかる方がいたら、教えてください。よろしくお願いします。

  • PerlからOracleに接続

    ご存知の方おられましたら、ご教示お願い致します。 昨日より、Perlのプログラムを始め、Oracleに接続するものを作成しておりまが以下のエラーがでてきて困っております。 接続部分ソース--------------------------- #!C:\パス use DBI; $dbh = DBI->connect("dbd:Oracle:データベース名", "ユーザ","パスワード"); エラー----------------------------------- install_driver(Oracle) failed: Can't locate loadable object for module DBD::Orac le in @INC (@INC contains: C:/Program Files/Perl/lib C:/Program Files/Perl/site/ lib .) at (eval 1) line 3 Compilation failed in require at (eval 1) line 3. Perhaps a module that DBD::Oracle requires hasn't been fully installed at database.pl line 5 環境--------------- OS WindowsXP pro perl ActivePerl-5.8.6.811 DBI,DBDはPPMでインストールしました。 接続先 OS Windows2003 DB oracle9 後、 use DBI; @ary = DBI->available_drivers; foreach (@ary){ print $_,"\n"; } でDBI使用できるDBDドライバを出した結果、Oracleが表示されておりました。 どうか、ご存知の方お願い致します。

  • トリガーについて

    このジャンルでお願いします。 次のようなテーブルで DROP TABLE IF EXISTS item; CREATE TABLE IF NOT EXISTS item ( id int(11) NOT NULL AUTO_INCREMENT, parent_id INT, name varchar(32) NOT NULL, level int NOT NULL, FOREIGN KEY (parent_id) REFERENCES item(id) ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO item (parent_id, name) VALUES (null, 'item1'); INSERT INTO item (parent_id, name) VALUES (1, 'item2'); INSERT INTO item (parent_id, name) VALUES (2, 'item3'); INSERT INTO item (parent_id, name) VALUES (3, 'item4'); INSERT INTO item (parent_id, name) VALUES (2, 'item5'); INSERT INTO item (parent_id, name) VALUES (null, 'item6'); INSERT INTO item (parent_id, name) VALUES (6, 'item7'); INSERT INTO item (parent_id, name) VALUES (null, 'item8'); DROP PROCEDURE IF EXISTS UPDATE_LEVEL; DELIMITER // CREATE PROCEDURE UPDATE_LEVEL() BEGIN DECLARE CNT INT; DECLARE LVL INT; SET LVL=1; UPDATE item SET level=0; UPDATE item SET level=LVL WHERE parent_id IS NULL; SELECT COUNT(*) INTO CNT FROM item WHERE level=LVL; WHILE CNT>0 DO UPDATE item INNER JOIN (SELECT id FROM item WHERE level=LVL) as temp ON parent_id=temp.id SET item.level=LVL+1; SET LVL=LVL+1; SELECT COUNT(*) INTO CNT FROM item WHERE level=LVL; END WHILE; END // DELIMITER ; DROP TRIGGER IF EXISTS TRG_INSERT_ITEM; DELIMITER // CREATE TRIGGER TRG_INSERT_ITEM AFTER INSERT ON item FOR EACH ROW BEGIN CALL UPDATE_LEVEL(); END; // DELIMITER ; itemテーブルにinsertした場合にトリガーでUPDATE_LEVEL()を実行するようにしているのですが、 実際に挿入すると、 >Can't update table 'item' in stored function/trigger because it is already used by statment which invoked this stored function/trigger . このようなエラーが出てしまいます・・・ UPDATE_LEVEL()にinsertらしき記述はないと思うのですが、 これはなぜこのようなエラーが出るのでしょうか?

    • ベストアンサー
    • MySQL

専門家に質問してみよう