2012-08-09 59 views
4

我們正在考慮使用單個SQL Server數據庫來存儲多個客戶端的數據。我們覺得在一個數據庫中的所有數據可以比「每個客戶端獨立的數據庫」設置更容易管理。SQL Server - 強大的客戶端數據保護(多租戶)

我們最擔心的是意外訪問錯誤的客戶端。如果我們偶然將一個客戶的數據顯示給另一個客戶,這將是非常非常糟糕的。我們執行了很多查詢,並且擔心有人說「給我寫這個問題的查詢,並在15分鐘內向客戶開會」。如果有人粗心大意並忽略了爲正確客戶端篩選的WHERE條款,那麼我們將陷入嚴重困境。是否有強大的SQL Server設置或設計模式,使它不可能(或者至少非常困難)意外地從單個「全局」數據庫中提取錯誤的客戶端數據?

需要說明的是,這不是客戶端直接使用或通過應用程序使用的數據庫(尚)。我們正在談論一些由我們的程序員訪問的數據庫,我們害怕自己搞砸了。

+1

請先閱讀本http://msdn.microsoft.com/en-us/library/aa479086.aspx – 2012-08-09 19:23:43

回答

2

至少應該將客戶端數據放在單獨的模式中。在SQL Server中,模式是授權的單位。只有授權給定客戶的人才能看到客戶的數據。除了其他保護之外,您應該使用數據庫的內置授權功能。

現在,這聽起來像是你處於一個非常小的一羣人訪問所有人的數據的情況。那麼,如果你成功了,那麼你將來可能需要更多的人。事實上,您可能會讓某些客戶直接訪問數據。如果這是他們的數據,他們會希望在其上運行應用程序。

我最好的建議,如果你打算增長,就是把每個客戶的數據放在一個單獨的數據庫中。我會構建系統,以便該數據庫可以位於遠程服務器上。如果需要與常用數據同步,則需要制定移動數據的複製策略。

可能認爲讓一個客戶端看到另一個客戶端的數據是不好的。從商業角度來看,這是致命的 - 就像「公司倒閉,沒有工作」一樣致命。您的客戶可能比您更關心保密性。而且,確保保護的架構將使他們更舒適。

+0

是的,我們需要確保意外訪問客戶端數據是永遠不會發生的事情。我想你不認爲大量的複雜數據庫會變得不穩定?例如,如果需要對任何數據庫對象進行更改,則必須針對所有數據庫執行此操作... – Tekito 2012-08-09 19:27:28

+0

嗯,大概這就是爲什麼客戶要向您付費以維護此功能。會發生什麼是你將開發一套簡單的工具(希望存儲過程),這將使這成爲可能。您將需要一個發佈過程。這實際上是一件好事。您還必須處理髮布新功能的情況,但一位客戶希望繼續使用舊系統。 – 2012-08-09 19:31:43

+0

標記爲答案,因爲我認爲最終這是老闆最終要做的,即使我最初是在尋求單數據庫解決方案。 – Tekito 2012-08-10 22:37:55

1

您可以爲每個採用必需參數@customerID的表格設置一個內嵌表值函數,並將該特定表格過濾爲該客戶的數據。如果整個應用程序只使用這些TVP的應用程序將是安全施工

可能會有一些性能影響。確切的數字取決於模式和查詢。然而,它們可以爲零,因爲內聯TVP與查詢的其餘部分一起被內聯和優化。

+0

同意,將工作,只要只有TVF被使用過,但仍然擔心忽略TVF的程序員,並自己寫一個查詢表。 – Tekito 2012-08-09 19:18:18

+0

您可以輕鬆地通過閱讀代碼來審計代碼。你可以*證明*它很容易正確。 – usr 2012-08-09 19:21:46

1

多租戶數據架構 http://msdn.microsoft.com/en-us/library/aa479086.aspx

這裏是我們做什麼(MySQL的不幸):

    每個表
  1. 表是一個模式
  2. 「租客」 欄[1]
  3. 視圖位於另一個架構中(以便於安全和命名)。視圖不得包含租戶列。視圖確實基於當前用戶上租客WHERE
  4. 承租人值是通過在刀片觸發設置,基於用戶

假設所有的DDL是SQL文件源控制下(它應該be),那麼擁有許多數據庫或模式並不那麼困難。

[1]在MySQL的模式被稱爲「數據庫」

+0

感謝您的鏈接,非常翔實 – Tekito 2012-08-10 22:39:18