默认UpdatedBy由SQL Server 2008表中的列创建

时间:2011-07-13 16:35:12

标签: sql sql-server-2008

我最近遇到了我的团队内部的一场冲突,其中“某人”连续更新,没有人愿意接受谁做了。我们总是有更新列,更新日期,创建日期列和创建日期列,对数据库具有读写访问权限的人可以更新数据。

现在我的问题是我想将这些特定列设置为只读,并希望根据访问数据库的人来默认值,这可能吗?如果是,我们将非常感谢任何帮助。

  • NIK

3 个答案:

答案 0 :(得分:3)

在您当前的设置中,如果您的开发人员能够访问听起来像这样的数据,那么就没有一种防弹方式来获得您正在寻找的完整性保证。你为审计做的任何事情都可以伪造和撤消。

您可能希望查看名为“更改数据捕获”的Sql Server功能。它至少需要企业版,但它允许您自动执行此操作并将您的审计跟踪与实际数据(一件好事)分开存储,这种方式无法被具有高权限访问权限的开发人员伪造。

答案 1 :(得分:1)

您必须通过存储过程和视图限制对这些表的访问。

使用添加/更新过程,您可以确保只有您的过程更新跟踪列。然后,您将删除对这些表的写入权限。因此,用户必须使用添加/更新过程来输入/修改这些表的数据。

答案 2 :(得分:1)

您可以使用触发器。我想,你的大学不会作弊和禁用/启用触发器。

CREATE TABLE [dbo].[myTable](
    [MyID] [uniqueidentifier] NOT NULL,
    [MyText] [nvarchar](50) NULL,
    [MyNumber] [int] NULL,
    [CreatedBy] [nvarchar](50) NULL,
    [UpdatedBy] [nvarchar](50) NULL,
 CONSTRAINT [PK_myTable] PRIMARY KEY CLUSTERED 
(
    [MyID] ASC
)
GO

CREATE TRIGGER [dbo].[myTable_OnInsert]
   ON  [dbo].[myTable]
   INSTEAD OF INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    INSERT INTO dbo.myTable (MyID, MyText, MyNumber, CreatedBy, UpdatedBy)
        SELECT
            I.MyID, I.MyText, I.MyNumber, CURRENT_USER, CURRENT_USER
        FROM inserted AS I

END
GO

CREATE TRIGGER [dbo].[myTable_OnUpdate]
   ON [dbo].[myTable]
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE dbo.myTable
        SET UpdatedBy = CURRENT_USER
    FROM inserted AS I

END
GO