2010-08-05 150 views
4

我有一系列從db中選擇數據的存儲過程。我有一個角色(cctc_reader),具有對這些過程授予的執行權限。其中一個過程調用另一個名爲recControl_system_option的存儲過程,該過程又查詢Information_schema.columnsSQL Server 2008授予information_schema.columns的權限

的問題是,在這個PROC查詢

select column_name from information_schema.columns where table_name = 'recControl_manager'

不返回任何記錄。 cctc_reader有權限授予上:

  • 每個選擇PROC
  • recControl_system_option

所以理論上這應該工作。在dbo下運行時我沒有問題。

如果我將db_datareader授予cctc_reader,查詢很好,但我不想授予讀者對所有表的權限(因此我爲什麼使用存儲的特效)。我已經嘗試按照某些文章中的建議授予對主數據庫中的Information_schema的選擇權限,但仍無法使其工作。

有什麼建議嗎?

回答

4

對象的元數據的可見性是受VIEW DEFINITION權限:

GRANT VIEW DEFINITION ON ... TO cctc_reader; 

視圖定義權限允許用戶 上看到它的權限被授予可保護 的元數據。 但是,查看定義權限 不賦予對安全本身的訪問。例如,僅在桌面上被授予VIEW DEFINITION 權限的用戶 可以看到與 sys.objects目錄視圖中的表有關的元數據 。但是, 沒有其他權限,如 SELECT或CONTROL,用戶不能從 讀取表中的數據。

授予權限的權利取決於您的方案。它可能是dbo或其他模式,它可能是數據庫本身,它可能是單個表。如果我在你的位置,我會代碼簽署recControl_system_option過程,並且我會授予在服務器級別簽名上的VIEW ANY DEFINITION,這是一種更好和更安全的方式,即使用角色和授予角色權限。有關如何簽署過程並向簽名授予服務器級權限的示例,請參見Signing an activated procedure

+0

太棒了!感謝您的意見。我已經研究出如何解決這個問題,並且給了我很多想法......。 – pilsdumps 2010-08-05 16:04:50

2

Remus提到,元數據可見性會影響查詢系統表和視圖時返回的數據。如果您對安全(對象,登錄,無論什麼)沒有權限,它將不可見。

根據您的情況,您將允許內部調用已經EXECUTE AS OWNER,或在UDF,作爲EXECUTE AS OWNER

我們使用這種技術,我們的元數據查詢包裹INFORMATION_SCHEMA.COLUMNS。