我们有一个需要以特定方式锁定的表,我们正在寻找最好的(可靠性是第一优先,性能是第二)方法来实现它。涉及此表的规则是新记录可以自由添加,但是一旦它们被添加,除了一个例外,它们永远不应该被更改。对于此表中的记录,将允许一个有效的更新命令,应阻止所有其他更新或删除。这是迄今为止我们已经制定出来的方法的一个粗略的例子,有什么好方法可以改进它吗?
表格如下:
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通常不了解我们对任何给定数据库的操作。我知道拥有这些权限的人可以规避我们实施的任何事情,这个级别的目标是防止意外。我还应该注意,如果有人尝试非法更新,我们希望它抛出错误,它不应该无声地失败或对允许的字段执行部分更新。