2016-08-11 94 views
0

我想要控制db用戶在sql中選擇表。例如。有一個用戶名爲'user1',另一個是'user2'。限制根據用戶角色返回的行數

User1具有管理員角色在數據庫上。用戶2的角色較低。當用戶運行一個查詢時,我想檢查用戶名和userrole,如果它是一個管理員用戶,那麼我允許它運行。如果它的用戶角色較低,我需要限制查詢的結果(不是拒絕,只是限制)。我不想讓較低角色的用戶看到表格上的PhoneNumber列,所以我需要將該用戶的結果作爲除PhoneNumber列之外的表格。

我知道我可以在角色區域的列權限上做到這一點。但我也想限制這樣的查詢:只返回頂部(5)結果,不是所有的表。

所以我需要一個存儲過程或類似的東西,當用戶執行查詢時自動運行。是否有任何類似的SQL或類似的東西在SQL?

在此先感謝。

+2

不,沒有。你用'f5'表示你的用戶是否可以訪問SSMS?您最好的辦法是使用角色刪除訪問限制表,並允許通過針對存儲過程執行結果。在存儲的proc中,您可以檢查角色/權限並返回適當的值。或者,您可以使用Sql Views並授予/限制這些視圖的權限。然而,對我來說,整個寫作聽起來有些詭異,可能最好是重新評估實際需求,然後嘗試推動這項工作,特別是如果用戶已經有權使用SSMS。 – Igor

+0

如果應用程序不是SSMS,它是什麼? –

+0

他們使用ssms連接到sql實例。但這不是我的問題。我需要的是'用戶運行查詢'和'sql返回結果'之間的控件。我需要檢查用戶想要運行的查詢。然後我決定什麼給sql服務器來給我想要的結果。例如 –

回答

1

沒有辦法直接做到這一點。

你可以用一個表值函數做一些事情,比如根據用戶角色附加一個WHERE子句。但是,TOP運營商無法做到這一點,因爲這必須最後應用。

理論上講,你可以用自己的sp_execute變體引入SQL重寫,但實際上會引入SQL注入攻擊的巨大漏洞。

選項:

  1. 處理在應用層面的限制。
  2. 撤銷表上的SELECT權限並僅通過存儲過程公開它。您可能需要大量存儲過程來說明用戶可能需要數據的各種方式。
+0

我認爲你是對的。感謝回覆 –

+0

我希望我不是。這聽起來像是一種有用的能力。 –