2011-04-13 54 views
2

我有一個.NET應用程序,它將信息存儲在sql服務器數據庫中。許可問題

我想爲我的應用程序添加許可,只允許數據庫中的某些項目取決於許可證。 所以說,例如,我有一個「物品」表,許可證是5000件物品。

我面臨的問題是,如果錶行數大於5000,我不能依靠我的應用程序不插入項目,因爲用戶可以直接將項目插入到數據庫中,因爲由服務器提供客戶可以完全不受限制地訪問數據庫。 (我不能使用任何SQL服務器端解決方案以及由於這個特定的問題)

此外,如果我添加一個字段的表填充項目信息用密碼散列然後用戶可以不再手動添加項目,但然後我將不得不運行整個表格,並檢查每個項目是否已授權並計數許可項目,然後再確定是否添加每個新項目。這是不實際的,因爲我每分鐘收到數百件物品,因此會大大影響性能。

有沒有人有任何想法如何實現這一目標?

+1

你有沒有想過限制該軟件以不同的方式。除了簡單地知道有多少行,並且如果有超過5000個項目,根本不允許應用程序運行,我就沒有辦法。老實說,你不能同時擁有「允許用戶手動添加項目」和「防止用戶在達到5,000限制後添加項目」。 – 2011-04-13 15:18:50

+0

我不希望用戶手動添加項目,但問題是用戶也可以訪問數據庫,因爲有時我會在他們的服務器上安裝應用程序。 – ElArZ 2011-04-13 15:26:17

+0

如果您每分鐘收到100個項目,那麼您的許可證僅在大約50分鐘內有效嗎?你確定**這是要走的路嗎? – 2011-04-14 15:22:14

回答

2

您可以顛倒限制條件並將查詢限制爲5000條結果。這可以通過TOP條款輕鬆完成。

用這種方式,無論用戶推入數據庫的行數是多少,您的程序只能使用許可的行。

3

您最好的選擇可能是Items表上的INSTEAD OF trigger拒絕插入超出限制。

+0

用戶將有權訪問數據庫,因爲它是他們自己的服務器,甚至有時他們自己的SQL實例很可悲,我不能在SQL端使用任何方法。 – ElArZ 2011-04-13 15:28:26

+0

@ElArZ如果用戶完全控制了數據庫,那麼你可以做的事情並不多。他們可以做的伎倆來抵消客戶端可以做的任何事情。他們可以用視圖替換表格,然後隨意交換和刪除基礎表格的各個部分。 – 2011-04-13 15:32:27

+0

@ElArZ,你爲什麼不讓這個'INSTEAD OF'觸發器在代碼上做一個鏡像。如果超級用戶更改或刪除觸發器,則可以將其與代碼1進行比較並限制訪問權限,重新創建觸發器或僅執行無效操作並關閉程序 – 2012-06-19 20:23:32

0

我也推薦一個簡單的觸發器(如果你願意,你可以基於配置表)。

我想了解更多有關整體業務需求的信息,因爲如果您每分鐘收到數百行數據,似乎表格會在一小時內填滿。

0

我會將DL的許可證驗證全部分離出來。相反,如果驗證失敗,應用程序會在某個時刻運行驗證腳本,然後執行所需的(禁用/ warnig)操作。

像這樣的東西應該返回速度非常快:

SELECT [TableName] = so.name, [RowCount] = MAX(si.rows) FROM sysobjects so, sysindexes si WHERE so.xtype = 'U' AND si.id = OBJECT_ID(so.name) GROUP BY so.name ORDER BY 2 DESC