2017-01-23 53 views
1

如何確保數據庫中的特定數據不再被更改。有效地使數據庫記錄只讀

我們正在使用TSQL。在數據庫中我們存儲合同修訂。這些有狀態:草稿/活動。當狀態變爲活動狀態時,修訂版可能再也不會被改變。版本可以有8個活動模塊(每個模塊都有自己的表格),每個模塊都有自己的設置和子表格。這會創建一個包含記錄的整個樹,當合約修訂版已設置爲活動時,這些記錄可能永遠不會再發生變化。

理想情況下,我會簡單地將這些記錄標記爲只讀。但是這樣的事情到今天還不存在。接下來想到的是觸發器。因此,我必須將這些觸發器添加到很多表格中,這些表格都與合同修訂相關。

現在也許還有其他的方法,比如一個數據庫僅用於歸檔,用戶只能在其上擁有插入權限。因此,當合同修訂已激活時,它將從一個數據庫移動到存檔數據庫(允許插入)。並且不能再被修改(DENY UPDATE | DELETE)。

但也許還有其他更多的巧妙的選擇,我沒有想到,你做到了。也許包括CLR或不包括什麼。

那麼如何才能在我們的TSQL數據庫中有效地讀取記錄的樹狀結構,這是最免維護,易於理解,快速設置的,並且可以以最通用的方式應用?

+2

限制用戶abilites實際上影響更改。使有權訪問上述表的用戶僅具有插入,不刪除或更新的權限。 – Takarii

+0

也許這個問題可能是有用的:http://stackoverflow.com/questions/11185932/how-can-i-disable-update-table-for-all-user –

+0

@Takarii謝謝你的評論。然而,這不是解決問題的方法,因爲我們還希望防止存儲過程中的錯誤和EF無法意外更改或刪除數據。想象一下UPDATE語句中的錯誤連接。在SQL和C#中傳播了很多代碼,這些代碼對合約修訂版或其模塊中的某個版本起作用。 –

回答

1

你(觸發器,授予的權利...)可能被具有較高權限的用戶可以克服什麼都,這你肯定知道...

這只是存檔這些數據?

我想到的一個想法是創建一個嵌套的XML,其中包含大型結構中的所有數據,並將其放在旁邊的表中。創建一個INSTEAD OF UPDATE,DELETE TRIGGER,你什麼都不做。讓這些表格爲1:1相關。

您仍然可以使用此數據,但速度不如從物理表讀取的速度快。

如果需要,甚至可以將XML轉換爲字符串並計算一些散列碼,然後將其存儲在不同的位置以檢查操作。

整個過程可能在一個單獨的存儲過程調用中完成。

+0

謝謝你的回答。存儲散列可以避免標誌錯誤。好想法!我將研究這個XML。非常感謝。 –

相關問題