删除触发器后的SQLite

时间:2013-12-20 09:27:40

标签: sqlite

我有一张表,由于未知原因,数据会被删除。我们认为可以帮助的一个步骤是在db中编写一个触发器,并可能在另一个表中记录一些值,我们可能认为这可能是罪魁祸首 到目前为止:

CREATE TRIGGER audit_log_delete after delete on usvn_users_to_projects BEGIN 
   insert into usvn_audit_delete(emp_id, emp_name, emp_is_adm ,ENTRY_DATE ) select        
   uu.users_id , uu.users_login ,uu. users_is_admin ,datetime('now') from usvn_users  
   uu,usvn_users_to_projects up where old.users_id=uu.users_id;
END;

但是这会在新表格中记录很多记录。

1 个答案:

答案 0 :(得分:1)

SELECT连接两个表uuup,但实际上并未在up上使用任何连接限制。 因此,您将获得两个表的笛卡尔积,即,与WHERE条件匹配的每个uu记录对于每个up记录都会重复一次。

你实际上没有从up表中读取任何内容(old.users_id是一个独立于up表的单个值),所以你应该放弃它:

CREATE TRIGGER audit_log_delete
AFTER DELETE ON usvn_users_to_projects
FOR EACH ROW
BEGIN
    INSERT INTO usvn_audit_delete(emp_id,
                                  emp_name,
                                  emp_is_adm,
                                  entry_date)
      SELECT users_id,
             users_login,
             users_is_admin,
             datetime('now')
      FROM usvn_users
      WHERE users_id = OLD.users_id;
END;