2013-12-20 175 views
1

我有一個表從中刪除數據由於未知的原因。其中一個我們認爲可以幫助的步驟是寫在數據庫觸發器並可能在其中我們可能會認爲可能是罪魁禍首 到目前爲止另一個表記錄一些值:SQLlite刪除後觸發

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

SELECT連接兩個表uuup,但實際上並沒有在up上使用任何連接限制。 因此,您可以得到兩張表的笛卡爾積,即每個uu記錄與WHERE條件相匹配,每個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; 
+0

其實,即使這是給多個記錄。雖然你所提出的建議是絕對有道理的,但我想知道是否還有其他一些導致這種情況的結果。 –

+0

如果'usvn_users.users_id'是主鍵,則每個刪除的記錄不能得到多於一條記錄。 –