1

我正在處理包含一系列應用程序的所有表的數據庫(我們稱之爲DB_data)。爲了儘量減少升級過程中的停機時間,已創建一個外觀數據庫(我們稱之爲DB_facade),該數據庫具有DB_data中每個表的視圖。它還包含所有的功能和存儲過程,這些功能和存儲過程與這些觀點相反。跨數據庫視圖權限

在試圖鎖定DB_data中的安全性時,我們對DB_data中的所有用戶的所有表執行了DENY操作。所有這些用戶也已在DB_facade中創建,並具有對視圖的權限。

這裏的問題是,因爲跨數據庫所有權鏈接DB_data中的DENYs重寫了DB_facade中的GRANT。

由於存在潛在的安全問題(儘管在我的原始測試中,這看起來糾正了訪問問題),我想避免爲這兩個數據庫啓用所有權鏈。此外,我們正在努力減少對應用程序的影響,因此要求通過存儲過程進行所有訪問並使用證書(例如)不起作用。

有沒有人有任何其他建議如何處理?

謝謝!

+0

您可能會在[權限授予](http://www.sommarskog.se/grantperm.html)和[訪客用戶帳戶](http://www.mssqltips.com/tip.asp?提示= 1172)有幫助 – 2010-07-19 20:28:09

回答

1

如果您在DB_data中的表中排除了DENY,是否存在此問題?如果您沒有對這些表格明確授予權限,則可以通過視圖獲得所需的安全性並獲得訪問權限。

+0

只要我不拒絕對錶的訪問,它就可以正常工作,但我們試圖阻止通過DB_data直接訪問表。 – 2010-07-20 00:38:40

+0

由於表格中沒有GRANT,因此用戶無法訪問表格。但你說得對,這不是最好的解決方案。我可能有另一個想法。我會嘗試另一個答案。 – bobs 2010-07-20 16:53:28

0

從我看到和做的,sql服務器不會讓你有任何權限,除非明確告知。您應該能夠將DB_Data中的select(或使用角色datareader)授予用戶,並且只要它是相同的帳戶並且它映射到兩個數據庫(您必須授予db_facade上的select和exec)才能工作正好。

+0

如果它位於單個數據庫中,則拒絕訪問表不會阻止通過這些表上的視圖進行訪問。儘管跨數據庫,即使用戶綁定到相同的帳戶,SQL Server也會阻止訪問表,即使通過用戶擁有權限的視圖也是如此。 – 2010-07-20 00:36:00

+0

我希望我有一個很好的實驗室設置,我可以用它來測試這個。 – DForck42 2010-07-20 15:10:02

0

您可以在DB_facade數據庫中的每個視圖的DB_data數據庫中創建一個視圖。新視圖將有權從表中選擇。對DB_data中的視圖進行GRANT SELECT。將DB_facade上的視圖更改爲DB_data上的視圖中的SELECT。而且,表格會設置DENY。

我認識到這個缺點;用戶仍然可以與DB_data數據庫進行交互。他們將無法訪問表格,但他們可以訪問新的視圖。