2008-08-30 94 views
11

我有一個表定義(請參閱下面的代碼片段)。我怎樣才能添加一個約束或其他什麼,以便隨時更新行,LastUpdate列會自動更新?SQL Server 2005自動更新日期時間列 - LastUpdated

CREATE TABLE dbo.Profiles 
(
     UserName        varchar(100)   NOT NULL, 
     LastUpdate        datetime    NOT NULL CONSTRAINT DF_Profiles_LastUpdate DEFAULT (getdate()), 
     FullName        varchar(50)    NOT NULL, 
     Birthdate        smalldatetime   NULL, 
     PageSize        int      NOT NULL CONSTRAINT DF_Profiles_PageSize DEFAULT ((10)), 
     CONSTRAINT PK_Profiles PRIMARY KEY CLUSTERED (UserName ASC), 
     CONSTRAINT FK_Profils_Users FOREIGN KEY (UserName) REFERENCES dbo.Users (UserName) ON UPDATE CASCADE ON DELETE CASCADE 
) 

回答

4

一個defaul限制只適用於刀片,用於更新使用觸發器

2

你將不得不使用觸發器。

-1

我的建議是創建一個存儲過程LASTUPDATE對於當前日期的缺省值爲()。

我試圖避免過去觸發器,因爲pre-SQL2005定位和編輯它們是臀部疼痛。尤其對於剛接觸您的項目的開發人員。

還要添加它作爲列定義的默認值。

+4

這樣的事情必須始終在觸發器中完成。否則它並不總是正確的,因爲有許多方法可以在不使用sps的情況下更改數據。僅僅因爲他們是一種痛苦,如果你想在數據庫中獲得準確的數據(應該是優先級1),那麼沒有理由避免它們。 – HLGEM 2009-04-15 13:43:00

23

我同意其他人 - 在LastUpdate列上設置GetDate()的默認值,然後使用觸發器來處理任何更新。

只是一些簡單的像這樣:

CREATE TRIGGER KeepUpdated on Profiles 
FOR UPDATE, INSERT AS 
UPDATE dbo.Profiles 
SET LastUpdate = GetDate() 
WHERE Username IN (SELECT Username FROM inserted) 

如果你想獲得真正看中的,有它評估什麼正在改變對什麼是在數據庫中,如果有一個區別只修改LASTUPDATE。

考慮這個...

  • 早上7點 - 用戶 'jsmith的' 與 'Smithe'(哎呀),LASTUPDATE默認爲早上7點

  • 上午8點的姓氏創建 - 'jsmith'給IT發電子郵件說他的名字不正確。要立即執行更新,所以最後的名字現在爲「史密斯」和(感謝觸發)LASTUPDATE顯示上午8點

  • 下午 - 你的懶鬼同事終於獲取與StumbleUpon公司無聊,檢查他的電子郵件。他看到來自'jsmith'的關於名稱更改的早期消息。他運行:更新配置文件SET姓氏='史密斯'其中用戶名='jsmith',然後去 回到衝浪MySpace。觸發器並不在意姓氏已經是'Smith',但是,所以LastUpdate現在顯示爲2pm。

如果你只是一味地改變LASTUPDATE只要一有更新語句運行,這在技術上是正確的,因爲更新沒有發生,但它可能更有意義實際的比較的變化並採取相應行動。這樣,同事的下午2點更新聲明仍然會運行,但LastUpdate仍然會顯示上午8點。

--Kevin

3

我與觸發同意這一觀點,但我會用一個加盟插入,而不是一個子查詢。但是,我想指出用戶名對於主鍵來說是一個特別糟糕的選擇。用戶名通常會發生變化,當他們需要更改所有相關表時。有一個用戶ID作爲密鑰,然後在用戶名上設置一個唯一的索引要好得多。然後,當用戶名稱改變時,您不需要改變其他任何東西。