有沒有辦法設置使用者執行 SP,但不訪問基礎數據表?
我們在兩個獨立的伺服器盒子上有兩個數據庫實例,它們是連結的。網站使用者需要能夠在 DatabaseA 上執行查詢 DatabaseB 表的儲存過程,但是它不應該能夠直接從 DatabaseB 上的表中讀取。
在 Sql Server 2005 中這樣的事情可能嗎?
只需創建一個儲存過程並授予 Web 使用者執行它的權限就會返回錯誤
Access to the remote server is denied because no login-mapping exists.
我真的不想讓網站使用者帳戶免費訪問 DatabaseB 表。
更新
Aaron 的使用建議
EXECUTE AS OWNER
不起作用,因為Owner
無權訪問 DatabaseB。使用
EXECUTE AS 'UserWithPermissions'
返回錯誤Access to the remote server is denied because the current security context is not trusted
。線上查找此內容使我相信這是因為數據庫未標記為TRUSTWORTHY,因此遠端數據庫拒絕連接。我懷疑如果兩個數據庫實例在同一台伺服器上,它會正常工作。我不想設置網路數據庫,
TRUSTWORTHY
因為它的一些安全性更寬鬆,所以我選擇了 Aaron 的另一個選項:創建一個使用者,DatabaseB
該使用者只能訪問包含網站應該訪問的數據的幾個特定視圖,然後進入連結伺服器對象的安全屬性並設置網站使用者在訪問連結伺服器時以新的受限使用者身份登錄。這使我的網站使用者可以有限地訪問私有數據庫中的特定數據,而無需訪問任何基礎表。
你不能用
execute as owner
or執行程序 Aexecute as 'db user tied to security account associated with linked server'
嗎?這樣來電者的權利就不必轉移…或者,您可以在只能執行所需查詢的遠端伺服器上創建一個登錄名,並向伺服器 A 上的現有連結伺服器添加一個模擬帳戶,以使本地 Web 伺服器登錄名模擬伺服器 B 上的新登錄名。
我更喜歡用模組簽名來解決這類問題:
use [<DatabaseName>]; go create certificate <CertificateName> encryption by password = 'CorrectHorseBatteryStaple1!' with subject = 'Signing Certificate for Module: <Object>'; add signature to object::<Schema>.<Object> by certificate <CertificateName> with password = <CertificatePassword>; go grant execute on <Schema>.<Object> to <LoginName>; backup certificate <CertificateName> to file = <Location>; go -- create certificate in master use [master]; go create certificate <CertificateName> from file = <Location>;
將過程更改為
execute as owner
並且<LoginName>
將能夠按預期使用它,而無需授予基礎對象。您仍然必須以某種方式處理跨伺服器權限,但這使得跨數據庫部分變得容易。