2013-08-28 167 views
3

我知道在刪除觸發器中沒有「NEW」值,所以不確定這是否可能。我試圖使用刪除觸發器之前記錄一些值,這工作正常,但我也想阻止刪除任何記錄,如果用戶沒有在where子句中指定任何東西。基本上,我不希望他們擦掉整張桌子。 (附代碼錯誤實際上是應用程序開發者)Mysql刪除前觸發器,防止刪除如果沒有where子句?

目前我有:

delimiter $$ 
create trigger tg_order_shipping_bd 
before delete on order_shipping 
FOR EACH ROW 
begin 

     insert into order_shipping_log 
     (log_type, inv_nbr, old_tracking_nbr) 
     values ('DEL', OLD.inv_nbr, OLD.tracking_nbr); 

end 
$$ 

那麼,有一個聰明的方法來計算受影響的行,如果大於1,防止刪除和錯誤?也許只是重新思考我們如何處理這個問題更好。感謝您的任何建議。

回答

3

這實際上是一個開發者應該只做一次的錯誤......但是,如果您認爲它需要在系統範圍內,這是正確的修復方法。沒有聰明需要。 (另外,MySQL中的觸發器是FOR EACH ROW,所以你的問題的答案是「不是真的」,儘管你可以巧妙地使用一個或兩個會話變量來破解它)。

MySQL有一個名爲sql_safe_updates的系統變量。

mysql> SET GLOBAL sql_safe_updates = 1; 
Query OK, 0 rows affected (0.00 sec) 

斷開並重新連接,以便您的會話獲取新的全局值。

mysql> delete from t1; 
ERROR 1175 (HY000): You are using safe update mode and you tried to update 
        a table without a WHERE that uses a KEY column 

當使用命令行客戶端,你可以暫時啓用此設置只用於此標誌的會話:

$ mysql --i-am-a-dummy 

(不,我不是做這件事)。

+0

非常好!我不知道那個!我會考慮到這一點。是的,它不可能發生,我們總是小心謹慎,但如果不檢查變量,不會在不知不覺中搞砸。我通常會將記錄標記爲已刪除並使用視圖或sproc,或者首先在重要表格上檢查值。在這種情況下還可以工作的是更新爲NULL,而不是在代碼中刪除。儘管使用安全更新,這是一個很酷的主意!非常感謝您的意見! – gregthegeek

+1

此外,關於意外刪除的主題,這裏有一個免費提示...如果您啓用了二進制日誌記錄並將'binlog_format'設置爲'row',那麼當刪除行時,二進制日誌實際上包含每個列中的所有列值刪除行。在緊急情況下,您可以解析「mysqlbinlog」的輸出並重建丟失的內容。根據存儲引擎和其他設置的不同,如果'binlog_format'設置爲'mixed',這也可能是真實的。 –

+0

啊,太棒了!謝謝! – gregthegeek