我們有一張需要以特定方式鎖定的表格,我們正在尋找最佳(可靠性是第一優先,性能是第二)的方式來實現它。涉及這張表格的規則是新紀錄可以自由添加,但一旦它們發生,除了一個例外,它們不應該被改變。在這個表中將會有一個有效的更新命令允許記錄,所有其他更新或刪除應該被阻止。以下是我們迄今爲止制定的方法的一個粗略示例,有沒有改進它的好方法?如何限制在表格上允許的更新
表看起來是這樣的:
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通常不知道我們對任何給定數據庫所做的事情。我知道擁有這些權限的人可以繞過我們所做的任何事情,這個級別的目標是防止事故發生。我還應該注意,如果有人嘗試進行非法更新,我們希望它發出錯誤,它不應該默默失敗或對允許的字段執行部分更新。
你說有人會有DBO訪問權限,說你試圖防止意外而不是惡意,但是你也在談論有人截斷表 - 肯定有人只會嘗試一個惡意截斷,如果他們已經是DBO,就像你說的那樣,沒有100%的解決方案。 – 2011-04-06 12:26:11
@Damien過去我們發生了意外截斷,通過無能/無知而不是惡意。把它歸結爲一些知情/過度偏執的政策制定者,但應用程序開發人員幾乎從不是DBO,甚至很少有人可以登錄到prod服務器。那些有權訪問的人幾乎不知道實際上正在對某個數據庫進行什麼操作,並且設法在過去搞砸了這些事情。我們只是試圖在這一個關閉儘可能多的門。 – Rozwel 2011-04-06 13:26:30