如果由 db_datareader 角色訪問,寫入記錄的 SP 會失敗嗎?
我有一個儲存過程,它可以由在某種 Java/WebSphere 類型平台上執行的應用程序遠端訪問。它需要一個參數,返回一些數據,就是這樣。
最近有一些關於它可能執行緩慢的討論 - 我非常有信心 SP 沒有理由執行緩慢。但是我在數據庫中添加了一個日誌表,並讓 SP 在輸入時寫入它,並在
SELECT
完成後再次寫入,這樣我就可以看到呼叫需要多長時間。此更改適用於我的 Windows 身份驗證登錄 - 當我使用遠端應用程序正在使用的應用程序登錄時,它也適用。但是,我是從 .Net 環境而不是 Java 進行連接。
當我更改 SP 進行日誌記錄時,我注意到我正在
INSERT
進入日誌表的 ID 正在跳躍 - 表明已經發生了失敗的 INSERT - 可能是由遠端應用程序引起的(因為這是唯一使用這個SP)。應用程序登錄僅具有
db_datareader
分配給它的角色。我當然已經GRANT
編輯EXEC
了應用程序登錄。
INSERT
是不是因為訪問登錄只有SP,所以SP不能連續db_datareader
?INSERT
如果是這樣,當我使用相同的登錄時,SP 怎麼會這樣做?
如果同一個使用者同時擁有表和儲存過程(通常是 dbo),則不會檢查權限。這被稱為“所有權連結”。
所以你可以在桌子上有一個拒絕,它不會被檢查。db_datareader 沒有區別:它沒有被檢查。
如果所有者不同(並註意架構的所有者很重要),則需要權限。請參閱上面的 MSDN 範例。
無論如何,您需要通過 TRY/CATCH 或 SQL Profiler 擷取錯誤以確保
根據 Microsoft 的說法(您希望他們知道),只要您已授予 SP 權限,那麼底層權限將通過權限鏈進行排序 - http://msdn.microsoft.com/en-us /圖書館/bb669058.aspx
應該意味著雖然您的使用者可以從數據庫中的任何表中讀取數據,但他們只能通過他們執行的儲存過程向他們寫入數據。