Mysql

觸發器在記錄上維護修訂號的最佳做法是什麼?

  • August 12, 2011

我在一個應用程序數據庫上實現了一個審計跟踪,它擷取舊值、新值、修改時間以及將其插入另一個表的使用者。我現在想為每個表添加一個修訂號,以提高冪等性檢查的效率。

就目前而言,擷取所有數據的觸發器是 AFTER UPDATE。我的理解是,如果我想更新我正在操作的行,我將需要使用 BEFORE 觸發器。IE:

CREATE TRIGGER `Table_A_Audit_Trigger` BEFORE UPDATE ON `Table_A`;
FOR EACH ROW BEGIN;
SET NEW.revision = OLD.revision + 1;

為此有兩個單獨的觸發器會更好,還是將插入也移動到 BEFORE 觸發器中會更好嗎?

編輯:AFTER UPDATE 觸發器的程式碼(以及表 DDL 本身)由應用程序層創建,然後在數據庫上執行(通常在軟體中創建或更新模型時)。同時添加此觸發器的創建並不難。

據我了解,如果審計插入成功但實際更新失敗,則組合成 BEFORE 觸發器的缺點是不一致。將所有內容放在 AFTER 觸發器中將需要在目標表上使用額外的 UPDATE,這會進一步降低性能,並且還會導致級聯問題。

按照我對您之前的問題的回答,這肯定會在負責更改的儲存過程或插入/更新查詢中得到更好的處理。那將是增加版本列而不是觸發器的邏輯位置。

如果觸發器是您可以確定將實施修訂計數的唯一方法,我建議您在任何需要的表上使用 INSTEAD OF 觸發器。然後,您可以在一個地方處理修訂增量和審計。

我發現觸發器是執行諸如在審計記錄和版本跟踪之前創建之類的好方法。審計查詢可能會變得有點龐大,因此在儲存過程中執行它們可能是合適的。我仍然會從觸發器中呼叫它。

與其他人所說的相反,您正在實施的似乎是業務規則,觸發器是執行它們的良好機制。使用觸發器可以很容易地執行規則。

在儲存過程中逐欄位審計可能會更好,但我會從觸發器中呼叫該過程。根據查閱數據的頻率,僅擷取之前的圖像可能就足夠了。在使用池連接的應用程序中,確定使用者是誰可能很困難。

無論你走哪條路,這都是自動化的好選擇。可以從表元數據生成適當的程式碼。

對於審計,我使用後觸發器前綴 AUD(更新或刪除後)來擷取舊數據。我對審計表使用表名的標準轉換,儘管可以使用審計模式來保存具有匹配表名的數據。在觸發後擷取記錄圖像更簡單,並有助於保持觸發內的凝聚力。

對於版本控制數據,我使用 BIU(在插入或更新觸發器之前。您可能希望使用 if 語句來選擇適當的操作,或者將觸發器分成兩部分。或者,您可以將觸發器分成兩部分,BI 和 BU。更新需要在觸發前發生。

使用標準命名允許您通過掃描元數據來查找失去的觸發器和審核表。您可以使用儲存過程來生成所需的組件。如果在表定義更改時更新組件,則會獲得獎勵標記。

引用自:https://dba.stackexchange.com/questions/4560