如何限制表上允许的更新

时间:2011-04-05 19:52:59

标签: sql-server sql-server-2008

我们有一个需要以特定方式锁定的表,我们正在寻找最好的(可靠性是第一优先,性能是第二)方法来实现它。涉及此表的规则是新记录可以自由添加,但是一旦它们被添加,除了一个例外,它们永远不应该被更改。对于此表中的记录,将允许一个有效的更新命令,应阻止所有其他更新或删除。这是迄今为止我们已经制定出来的方法的一个粗略的例子,有什么好方法可以改进它吗?

表格如下:

CREATE TABLE [dbo].[Table_1](
    ID int IDENTITY(1,1) PRIMARY KEY NOT NULL
    ,data1 varchar(64) NULL
    ,data2 varchar(64) NULL
    ,data3 int NULL
    ,data4 bit NULL
    ,ModifiedBy VARCHAR(32)
    ,ModifiedDtTm DATETIME
)

唯一允许的更新将通过类似于此的过程进行:

UPDATE dbo.Table_1
SET 
    data4 = 1
    ,ModifiedBy = @User
    ,ModifiedDtTm = GETDATE()
WHERE ID = @ID

锁定表格的目的是创建这两个触发器:

CREATE TRIGGER [dbo].[Table_1_UpdtLock] 
   ON  [dbo].[Table_1]
   INSTEAD OF UPDATE
AS 
BEGIN
    IF COLUMNS_UPDATED() = 0x70
        UPDATE dbo.Table_1
        SET 
            data4 = I.data4
            ,ModifiedBy = I.ModifiedBy
            ,ModifiedDtTm = I.ModifiedDtTm
        FROM dbo.Table_1 AS T
            INNER JOIN INSERTED AS I
                ON T.ID = I.ID
        WHERE I.data4 = 1
    ELSE
    BEGIN
        RAISERROR ('Table is locked.', 16, 0)
        ROLLBACK
    END
END

CREATE TRIGGER [dbo].[Table_1_DelLock]    
   ON  [dbo].[Table_1]
   INSTEAD OF DELETE
AS 
BEGIN
      ROLLBACK
      RAISERROR ('Table is locked.', 16, 0)
END

这还没有实现,我们正在努力确保我们第一次正确使用它,因为如果这些数据被破坏或丢失会有潜在的法律后果。

任何人都能看到任何允许某人编辑此表中数据的漏洞吗?此时我唯一知道的是可以在不激活删除触发器的情况下截断表。我目前最好的答案是建立对此表的FK参考。

任何突出的潜在性能问题?

建议更好的方法?

感谢您的帮助。

编辑:

我应该注意,对数据库的访问将受到尽可能严格的限制。但是,DBO始终存在一个帐户,我们的SA通常不了解我们对任何给定数据库的操作。我知道拥有这些权限的人可以规避我们实施的任何事情,这个级别的目标是防止意外。我还应该注意,如果有人尝试非法更新,我们希望它抛出错误,它不应该无声地失败或对允许的字段执行部分更新。

2 个答案:

答案 0 :(得分:2)

向表中添加触发器以进行插入或更新可以解决此问题。您还可以检查数据库中的用户帐户,并限制访问表。

修改

您可以看到触发here的优点和缺点。您还可以看到其性能影响here

答案 1 :(得分:0)

似乎很复杂,可能有一个模糊的边缘。

为什么不直接用旧值替换所有更新的值?

在oracle中,在更新触发器上,我会写这样的东西:

:new.id := :old.id;
:new.data1 := :old.data1;

然后确保没有用户对表有删除权限。