0

重複の可能性:
ORACLE 更新トリガーの後: ORA-04091 変更テーブル エラーの解決

したがって、管理者がログインからロックアウトされているかどうかを確認するトリガーがあります (ロックされている場合は、temp_pw に 1 が設定されます。次に、管理者に 4 桁のパス コードを送信して、アカウントのロックを解除します。問題は、トリガーが呼び出される前に、失敗したログインごとに 1 ずつ増加します。

トリガーの残りの部分では、管理者にパス コードを記載したメールを送信する前に、アカウントがロックされているかどうかを確認します。

Update Pi_admin_table set blah blahを取り出すと、メールが送信されますが、テーブルに新しいパスコードを挿入するためにそれを含めると、次のエラーが発生します。

 Message: 60 ORA-00060: deadlock detected while waiting for resource
 ORA-06512: at "PI_USER_ADMIN.TR_ADMIN_LOCKOUT", line 17
 ORA-04088: error during execution of trigger
 'PI_USER_ADMIN.TR_ADMIN_LOCKOUT' UPDATE *pi_admin_table SET
 failed_logins = failed_logins + 1 where
 EMAIL='nathan@perceptive.co.uk' returning failed_logins into :bind_var

これが私のトリガーです:

create or replace
TRIGGER "TR_ADMIN_LOCKOUT" 
AFTER UPDATE ON PI_ADMIN_TABLE
for each row
declare
-- pragma autonomous_transaction seems to fix trigger mutation errors. 
-- Look at rewriting trigger later.
--pragma autonomous_transaction;
tempEmail varchar2(80 BYTE);
tempID varchar2(80 BYTE);
mail_host varchar2(255);
mail_port varchar2(255);
mail_from varchar2(255);
tempPW int;
begin
  SELECT EMAIL, ADMINID
    into tempEmail, tempID
    from pi_admin_table
    where TEMP_PW = :NEW.TEMP_PW;

  SELECT MAIL_HOST, MAIL_PORT, MAIL_FROM
    into mail_host, mail_port, mail_from
    from pi_settings_table;

  select dbms_random.value(1,10000)
    into tempPW
    from dual;

  if tempEmail IS NOT NULL then
    UPDATE PI_ADMIN_TABLE SET RESET_PW=round(tempPW) where adminid=tempID;
    send_mail(tempEmail,
              mail_host,
              mail_port,
              mail_from,
              'Locked Out Event',
              'Your administrator account was locked out. '|| chr(10) || chr(10) ||
              'Please use this four digit pass code next time try to log in' ||
              chr(10) || chr(10) ||  
              'Temp pass code: '|| round(tempPW) );
  end if;
END;
4

2 に答える 2

2

Oracleでは、ROWトリガーのコードが、トリガーが定義されているテーブルに対してSELECT、INSERT、UPDATE、またはDELETEを発行することを許可していません。AUTONOMOUS TRANSACTIONを使用するか(ただし、上記の@Benのコメントで参照されている投稿の警告を参照)、COMPOUNDTRIGGERを使用するかを選択できます。

共有してお楽しみください。

于 2012-08-23T10:50:29.053 に答える
2

そのタスクにはトリガーを使用しないことをお勧めします。達成しようとしているロジックをストアド プロシージャにカプセル化します。

于 2012-08-23T11:34:38.103 に答える