2010-08-03 93 views
0

我有一種情況,我們想阻止特定場景的表的更新。最好的方法來防止更新

因此,對於95%的更新,我希望更新正常流動並更新所需的字段....對於其他5%我想阻止更新發生。這將基於更新中傳遞的數據以及表中當前填充的內容。

所以一個很好的例子是用戶提交他們今天的時間。如果他們重新提交他們的時間,我不希望數據庫允許更新發生,因爲該用戶的時間表已標記他們已經提交了他們的時間並且時間字段不爲空。

我正在玩這個觸發器,它似乎INSTEAD OF觸發器將允許我處理這...基本上只有讓更新發生,如果該條件成立。

有什麼想法?我很欣賞任何想法。

(讓我知道這是清除)

編輯:我很抱歉......這可能不是一個很好的例子。我們重用更新sproc來執行許多不同的更新,因此它是相當通用的。我想知道哪些情況下我不希望執行更新的最佳方法是什麼。使用觸發器基本上可以防止某人意外覆蓋以前輸入的數據。感謝您的輸入

**編輯2:**感謝所有......在仔細考慮之後馬丁是對的我應該將邏輯建立到存儲過程中。我被告知他們想用觸發器來處理這件事,但你們都是正確的......這不是正確的處理方法。再次感謝你的幫助。

感謝,

小號

+0

因此,如果我錯誤地鍵入「16」而不是「8」,我無法糾正我的時間? – 2010-08-03 23:24:27

+0

這種邏輯真的屬於你的應用層,而不是數據庫。如果你堅持使用db方法創建一個sp來封裝kekekala建議的邏輯,並使用智能編寫的更新語句,正如馬丁史密斯所說的那樣是一個好的解決方案。 – Tahbaza 2010-08-03 23:31:55

+0

你的編輯並沒有使事情變得更清楚,說實話。 「重新使用更新sproc」是什麼意思?你有1個更新不同表的通用程序? – 2010-08-03 23:47:11

回答

2

你並不需要爲這個觸發。例如像

UPDATE Users 
SET timefield = @timefield 
WHERE UserId = @UserId AND [Day][email protected] AND timefield IS NULL 

將適用於您的示例。然後,您可以檢查受影響的行,以查看是否實際更新了任何內容。

+1

正確 - 只是將您的業務規則構建到非數據庫抽象層,或者這種SQL語法沒有問題,尤其是在SP(另一個有用的業務規則的地方)時;只是不要觸發觸發器。 – dkretz 2010-08-03 23:40:57