2011-05-06 90 views
3

大家好,非常感謝您的回覆和評論。如何確定字段/列是否受UPDATE語句影響

我有一個表與幾個領域,其中有versionlast_modifiedmodified_by

我一個書面方式觸發:1後,每

  • 增加version /任何更新,
  • last_modified設置爲當前時間戳
  • 將最近一次更改的用戶的ID設置爲modified_by
  • 通過提高信號(在這種情況下),防止程序員忽略/忘記在UPDATE語句中設置modified_by = userid

我該如何做到這一點?

我想如果isnull(NEW.modified_by)檢查,但後來意識到NEW.modified_by採用相同的值OLD.modified_by如果它並沒有受到影響。此外,檢查NEW.modified_by是否等於OLD.modified_by並不完全可以,因爲它可能是用戶修改了以前由他自己修改的記錄。

有沒有辦法確定哪個字段哪裏受到UPDATE語句的影響?或者如果某個特定字段(modified_by)受到影響?

回答

3

我找不到任何可以檢查傳入信息的東西,以查看哪些字段受到影響。雖然我知道你試圖在觸發級別停止這個問題,但要求所有的表寫操作通過一個存儲過程可能是謹慎的。這樣你可以要求用戶字段。

如果這不是可能性,我認爲你可能需要變得棘手。例如,您可能需要將user_id寫入兩個字段(爲此創建一個空白的額外列)。然後,將虛擬列中的user_id與您正在更新的那個進行比較。一旦確定是否需要修改user_id,請再次清空虛擬列。這並不美麗,但它會完成工作。

+0

由於這些完全相同的修改(相同的行爲,相同的字段)發生在幾個表,我在做什麼是爲每個表創建一個更新觸發器,但實際發生的事情,是每個觸發器*檢查它是否可以繼續或需要提高信號*然後調用相同的存儲過程(執行實際工作)。注意:我將在編輯中發佈腳本。 – ahpoblete 2011-05-06 19:04:00

+0

我會與你的第二個建議(排序)。我會做的是有一個虛擬列,它將始終爲空。它必須在更新期間設置。我會檢查NEW值是否有效。如果它爲空,我會提高信號。如果它有效,我會將其存儲在適當的字段中。最後,我會將虛擬字段重置爲空。有什麼想法嗎? – ahpoblete 2011-05-06 19:42:24

+0

這正是我想解釋的。我相信這會對你有用。讓我知道結果如何。 – IAmTimCorey 2011-05-06 21:05:51

0

據我所知,你唯一的選擇就是檢查每一列的NEW值與OLD。

SET `ColumnAChanged` = NEW.ColumnA <=> OLD.ColumnA; 
SET `ColumnBChanged` = NEW.ColumnB <=> OLD.ColumnB; 
+0

我想這樣做,但是如果新值與舊值相同就可以了:它可以是用戶修改先前由他自己修改的記錄。 – ahpoblete 2011-05-06 18:37:35

3

我有一個類似的問題。我有一個名爲isDirty的tinyint列的表,並且希望在更新行時將其設置爲1,並且在該行已被「清除」時將其清除爲0。

問題是,NEW和OLD的值爲0和1的組合並沒有給我足夠的價值來解決我的問題。相反,我制定了一個「規則」,當列更新爲100時,它被設置爲清除值「0」,其他任何設置爲「1」。這個工作的原因是這個列只會有2個值中的一個,0或1,所以你可以使用100(或你選擇的任何值)作爲表示它是乾淨的「標誌」。

我知道,它聽起來有點向後,將其設置爲一個非零值回到0,但這是我選擇的方向,它的工作原理。下面是觸發的樣子:

CREATE TRIGGER calls_update BEFORE UPDATE ON `calls` 
    FOR EACH ROW 
    BEGIN 
     IF (NEW.isDirty = 100) THEN 
      SET NEW.isDirty = 0; 
    ELSE 
      SET NEW.isDirty = 1; 
     END IF; 
    END 
$$ 
+0

感謝您的輸入@Bill,但我認爲你在這裏有點偏離主題(或者根本不理解你的方法)。你的建議沒有解決我針對的問題,whis是: * - 通過提高信號(在這種情況下)*,防止程序員忽略/忘記在UPDATE語句中設置'modified_by = userid'。 像你這樣的解決方案可以很容易地被覆蓋:程序員可以簡單地在'isDirty'字段中插入一個100,0,1或更壞的任何其他號碼,而不是管理的(預期的)號碼,並且'modified_by'中沒有任何號碼。 如果我在這裏錯過了一些東西,請詳細說明一下嗎? – ahpoblete 2013-02-17 23:36:41