2010-06-23 53 views
1

讓我首先解釋上下文。由於表上的權限,sql存儲過程執行失敗

有兩個數據庫位於同一網絡上的兩臺不同的服務器上。有一個存儲過程將數據從一個數據庫中的表複製到另一個數據庫中的表(兩個數據庫具有相同的結構,但包含不同的數據)。用戶沒有權限直接查詢表(除非他們的角色允許他們這樣做),只能通過存儲過程。

現在的問題。

當存儲過程由用戶執行時,它無法提供錯誤消息,表明插入語句的目標表上的權限不允許用戶訪問它。但是,由於用戶具有執行存儲過程的權限,所以不應妨礙它,應該如此?

摘錄形式MSDN文檔:

「存儲過程採取所有權鏈的優勢,使用戶無需具有訪問數據庫對象的明確許可提供訪問數據的所有權鏈存在訪問對象時例如,存儲過程可以調用其他存儲過程,或者存儲過程可以訪問多個表,如果執行鏈中的所有對象具有相同的所有者,則SQL Server僅檢查EXECUTE權限,而不是調用者對其他對象的權限,因此您只需授予存儲過程的EXECUTE權限;您可以撤消或拒絕對基礎表的所有權限。「

爲什麼執行失敗呢?所有表都有相同的所有者。

回答

1

您是否在程序中使用了「OpenQuery」?嘗試使用包括鏈接服務器的完全限定名稱。

INSERT INTO Linked_Server.Database.schema.table_name 選擇.............

+0

是的,這工作!非常感謝。 – tomd 2010-06-23 12:17:22

0

您擁有的存儲過程會將數據插入到兩臺服務器的表中。您是否正在使用鏈接服務器,並且如果您是用戶有權通過鏈接服務器執行插入到表中並具有執行存儲過程的權限?

+0

沒有,數據移動在只有一個辦法 - 在源數據庫位於同一臺服務器上在其上執行存儲過程,並且目標數據庫位於另一個服務器上。 不確定你是否在使用「連接的服務器」來表示你的意思。這兩個sql服務器位於同一網絡(Intranet)上的兩臺不同的機器上。 賦予用戶權限以插入表格可以解決問題,但問題的實質是爲什麼這會成爲必要條件?這肯定會是一個安全漏洞。 – tomd 2010-06-23 12:12:59

+0

好的,Baaju使用完全限定名的想法已經奏效。無論如何感謝您的關注。 – tomd 2010-06-23 12:18:16

相關問題