0

データベースが 3 回のログインの失敗に気付いた場合に、テーブル内のすべての行を削除するトリガーや SP を作成する必要があります。奇妙なことに、これを実行するとトリガーが毎回起動し、SP も起動しますが、SP はログインに 3 回失敗した最初のレコードのみを削除します。したがって、ログインに3回失敗すると、トリガーはspを呼び出してレコードを削除しますが、テーブルに別のレコードを追加して再度ログインに失敗すると、SPを再コンパイルしない限りレコードは削除されません。失敗した別のログインを実行します。

現在、私はこれをトリガーとして持っています

create or replace 
TRIGGER TRIG_Failed_Login
after servererror on database

BEGIN
      If (ORA_IS_SERVERERROR(1017)) Then       
          insert into ERRORTRAP (errormessage, message_timestamp) VALUES ('Failed Login - 1017', current_timestamp);      
          commit;
          BEGIN
            sp_trucate_keystore();
          END;  
      END IF;    
End;

そしてこれをSPとして:

create or replace 
PROCEDURE sp_Trucate_KeyStore is

    RECORD_COUNT NUMBER;
    begin        
         SELECT COUNT(*) INTO RECORD_COUNT FROM ERRORTRAP;   
         BEGIN  
             IF RECORD_COUNT >= 3 THEN 
             INSERT INTO errortrap (errormessage) VALUES ('this is a test');
                 DELETE FROM KEYSTORE;
                 COMMIT;
             END IF; 
         END;
    END;

どんな助けでも大歓迎です。

4

1 に答える 1

0

行はどのように KEYSTORE テーブルに再挿入されますか? それらを別のセッションを介して手動で挿入し、次に失敗したログオン試行の前にコミットしていますか? このスレッドのコメントを思い出しました: Oracle ストアド プロシージャは、テーブル データをフェッチするために再コンパイルが必要です。

于 2013-10-11T03:21:22.190 に答える