2011-04-05 26 views
0

我們有一張需要以特定方式鎖定的表格,我們正在尋找最佳(可靠性是第一優先,性能是第二)的方式來實現它。涉及這張表格的規則是新紀錄可以自由添加,但一旦它們發生,除了一個例外,它們不應該被改變。在這個表中將會有一個有效的更新命令允許記錄,所有其他更新或刪除應該被阻止。以下是我們迄今爲止制定的方法的一個粗略示例,有沒有改進它的好方法?如何限制在表格上允許的更新

表看起來是這樣的:

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通常不知道我們對任何給定數據庫所做的事情。我知道擁有這些權限的人可以繞過我們所做的任何事情,這個級別的目標是防止事故發生。我還應該注意,如果有人嘗試進行非法更新,我們希望它發出錯誤,它不應該默默失敗或對允許的字段執行部分更新。

+0

你說有人會有DBO訪問權限,說你試圖防止意外而不是惡意,但是你也在談論有人截斷表 - 肯定有人只會嘗試一個惡意截斷,如果他們已經是DBO,就像你說的那樣,沒有100%的解決方案。 – 2011-04-06 12:26:11

+0

@Damien過去我們發生了意外截斷,通過無能/無知而不是惡意。把它歸結爲一些知情/過度偏執的政策制定者,但應用程序開發人員幾乎從不是DBO,甚至很少有人可以登錄到prod服務器。那些有權訪問的人幾乎不知道實際上正在對某個數據庫進行什麼操作,並且設法在過去搞砸了這些事情。我們只是試圖在這一個關閉儘可能多的門。 – Rozwel 2011-04-06 13:26:30

回答

2

將觸發器添加到您的表以進行插入或更新可能會解決此問題。您還可以檢查數據庫中的用戶帳戶並限制訪問這些表。

編輯

你可以看到有一個觸發here的利弊。您還可以看到其性能影響here

+0

感謝您的鏈接。其中大部分信息都讓我認爲我們走在了正確的道路上。 – Rozwel 2011-04-06 11:57:53

0

看起來很複雜,可能有一個模糊的邊緣。

爲什麼不只是靜靜地用舊值替換所有更新的值?

在Oracle中,在更新觸發器,我會寫這樣的事:

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

然後確保沒有用戶對錶中刪除權限。

+0

默默地失敗不是一種選擇。如果有人企圖進行非法更新,他們需要得到通知,而不是全部或部分更新被忽略。權限將盡可能嚴格地限制,但我們無法完全鎖定每個人,而且大多數不能鎖定在我們的環境中的人不會知道此表的用途或涉及訪問它的規則。 – Rozwel 2011-04-06 12:02:09

相關問題