2016-10-01 4 views
0

作成した2分後にレコードを削除するためにトリガーを作成したいと思います。これは「パスワードを回復する」シナリオで使用されるため、誰かがパスワードを回復するために検証コードを使用する時間枠が2分になります。 SQLiteは私が取り組んでいるものです。ここでは状況があります:トリガーをアクティブにしたレコードを削除するSQLiteトリガー

CREATE TABLE IF NOT EXISTS password_recovery(
    email VARCHAR(50) NOT NULL UNIQUE, 
    confirmation_id INTEGER(5) PRIMARY KEY, 
    FOREIGN KEY (email) REFERENCES users (email) 
     ON DELETE NO ACTION ON UPDATE NO ACTION, 
); 

CREATE TRIGGER IF NOT EXISTS password_recovery_deletion_timer AFTER INSERT ON password_recovery 
    BEGIN 
     DO SLEEP(120); 
     // i want to delete here but how do I pass which record triggered the trigger?     
    END; 
+0

私はこれを非常に危険な操作と考えています。 –

+1

有効期限とハッシュの両方を関連付けられたテーブルに格納しないでください。次に、ユーザーのハッシュが一致することを確認し、有効期限が現在の – atoms

+0

の原子よりも大きいことを確認してください。これは最終的にどこに行くのかと思います。 –

答えて

-1

は、両方があなたのケースであなたを助けることができるかもしれthis またはthis one.

のような参照を使用してみてください。私のコードにはいくつかの問題もあるようですが、そのことを見てください。そのトリガー用のトリガーを作成する必要があります。これは、これまでのリンクでも同様です。

DELETE FROM password_recovery WHERE rowid = NEW.rowid; 

しかし、トリガーがそれらを引き起こした文の一部として実行されます。

0

あなたは、テーブルの(主)キーを使用することができます。したがって、元のINSERT文は2分間待機し、挿入トランザクションがまだ完了していないため、ログインはデータベースからこの行を読み取ることができません。

これを実装する唯一の正しい方法は、回復要求と回復を2つの別々のトランザクションにすることです。

関連する問題