2012-02-07 45 views
0

我正在用SQL Server構建WCF服務,該服務將由WPF應用程序使用。我想我的數據庫表有一個像列: CreatedOn,CreatedBy,LastModifiedOn,LastModifiedBy填充CreatedOn,ModifiedOn列

有沒有一種方法來authomatically創建這些,如果還是不行,我可以創建它們,但有可能在某種程度上它們的值由填充SQL服務器?

感謝

+2

這很容易處理觸發器。對於修改後的列是否反映創建的列直到進行了另一個修改,或者是否希望那些在第一次更新之前爲NULL?您是否有任何偏好?你還想根據應用程序存儲用戶名,還是SQL/Windows認證用戶名?我只是不確定WCF是否有能力實際忽略表中的列。 – 2012-02-07 22:52:19

+0

感謝您的回覆亞倫。修改後的列應該與創建的列相同。用戶名存儲在自定義表中。 – Aaron 2012-02-08 21:06:30

+1

因此,如果用戶名是應用程序特定的,那麼SQL Server只會更新那些列,如果它知道誰調用存儲過程。它只知道如果你將它傳遞給處理插入/更新的存儲過程,那麼你需要對其進行修改。如果您從腳本中刪除所有「SUSER_SNAME()」部分,它將爲您處理日期/時間,但您將無法在不修改DML的情況下審覈用戶名。 – 2012-02-08 21:09:37

回答

1

做了幾個假設這裏 - 這CreatedBy/ModifiedBy將同一個系統變量,如SUSER_SNAME()和修改的值來填充應該反映相同的值創建的,最初。假設該基表:

USE tempdb; 
GO 
CREATE TABLE dbo.foo(fooID INT PRIMARY KEY); 
GO 

進行修改:

ALTER TABLE dbo.foo ADD CreatedOn SMALLDATETIME 
    NOT NULL DEFAULT CURRENT_TIMESTAMP; 

ALTER TABLE dbo.foo ADD CreatedBy NVARCHAR(32) 
    NOT NULL DEFAULT SUSER_SNAME(); 

ALTER TABLE dbo.foo ADD ModifiedOn SMALLDATETIME 
    NOT NULL DEFAULT CURRENT_TIMESTAMP; 

ALTER TABLE dbo.foo ADD ModifiedBy NVARCHAR(32) 
    NOT NULL DEFAULT SUSER_SNAME(); 
GO 

現在,你只需要一個觸發來處理後續更新:

CREATE TRIGGER dbo.foo_audit 
ON dbo.foo 
FOR UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF EXISTS (SELECT 1 FROM deleted) 
    BEGIN 
     UPDATE f 
      SET ModifiedOn = CURRENT_TIMESTAMP, 
       ModifiedBy = SUSER_SNAME() 
      FROM dbo.foo AS f 
      INNER JOIN inserted AS i 
      ON f.fooID = d.fooID; 
    END 
END 
GO 

如果您需要的用戶名中傳遞從應用程序,那麼WCF將不得不幫助。