【问题标题】:Populate CreatedOn, ModifiedOn columns填充 CreatedOn、ModifiedOn 列
【发布时间】:2012-02-07 22:49:57
【问题描述】:

我正在使用 SQL Server 构建 WCF 服务,该服务将由 WPF 应用程序使用。我希望我的数据库表具有如下列: CreatedOn、CreatedBy、LastModifiedOn、LastModifiedBy

有没有办法自动创建这些,或者如果没有,我可以创建它们,但是它们的值是否有可能以某种方式由 SQL 服务器填充?

谢谢

【问题讨论】:

  • 使用触发器很容易做到这一点。在进行另一次修改之前,您是否对修改后的列是否反映创建的列有任何偏好,或者您是否希望这些列在第一次更新之前为NULL?还是您要基于应用程序存储的用户名,还是 SQL/Windows 身份验证用户名?我只是不确定 WCF 是否能够真正忽略表中的列。
  • 感谢亚伦的回复。修改后的列应与创建的列相同。用户名存储在自定义表中。
  • 因此,如果用户名是特定于应用程序的,那么 SQL Server 只有在知道谁调用了存储过程时才会更新这些列。它只会知道,如果您将其传递到处理插入/更新的存储过程中,那么您需要对此进行修改。如果您从我的脚本中删除所有 SUSER_SNAME() 部分,它将为您处理日期/时间,但您将无法在不修改 DML 的情况下审核用户名。

标签: wpf sql-server wcf


【解决方案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 将不得不提供帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    相关资源
    最近更新 更多