0
我正在用SQL Server構建WCF服務,該服務將由WPF應用程序使用。我想我的數據庫表有一個像列: CreatedOn,CreatedBy,LastModifiedOn,LastModifiedBy填充CreatedOn,ModifiedOn列
有沒有一種方法來authomatically創建這些,如果還是不行,我可以創建它們,但有可能在某種程度上它們的值由填充SQL服務器?
感謝
我正在用SQL Server構建WCF服務,該服務將由WPF應用程序使用。我想我的數據庫表有一個像列: CreatedOn,CreatedBy,LastModifiedOn,LastModifiedBy填充CreatedOn,ModifiedOn列
有沒有一種方法來authomatically創建這些,如果還是不行,我可以創建它們,但有可能在某種程度上它們的值由填充SQL服務器?
感謝
做了幾個假設這裏 - 這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將不得不幫助。
這很容易處理觸發器。對於修改後的列是否反映創建的列直到進行了另一個修改,或者是否希望那些在第一次更新之前爲NULL?您是否有任何偏好?你還想根據應用程序存儲用戶名,還是SQL/Windows認證用戶名?我只是不確定WCF是否有能力實際忽略表中的列。 – 2012-02-07 22:52:19
感謝您的回覆亞倫。修改後的列應該與創建的列相同。用戶名存儲在自定義表中。 – Aaron 2012-02-08 21:06:30
因此,如果用戶名是應用程序特定的,那麼SQL Server只會更新那些列,如果它知道誰調用存儲過程。它只知道如果你將它傳遞給處理插入/更新的存儲過程,那麼你需要對其進行修改。如果您從腳本中刪除所有「SUSER_SNAME()」部分,它將爲您處理日期/時間,但您將無法在不修改DML的情況下審覈用戶名。 – 2012-02-08 21:09:37