2016-10-01 2 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.

Может и быть в состоянии помочь вам в вашем случае. У вас код для меня, похоже, есть некоторые проблемы, посмотрите на это. Вы должны создать триггер для этого триггера, аналогично показанному в ссылках, которые я предоставил.

0

Вы можете использовать (первичный) ключ таблицы:

DELETE FROM password_recovery WHERE rowid = NEW.rowid; 

Однако триггеры выполняются как часть заявления, что вызвало их. Таким образом, исходный оператор INSERT будет ждать две минуты, и логин не сможет прочитать эту строку из базы данных, потому что транзакция вставки еще не закончилась.

Единственный правильный способ реализовать это - сделать запрос на восстановление и восстановление двумя отдельными транзакциями.

Смежные вопросы