Sql-Server

SQL Server 允許儲存過程連結

  • March 1, 2022

我必須假設我不是 DBA,但我需要維護一個 SQL Server 實例,並且儲存過程權限連結幾乎沒有問題(希望條款是正確的)。

為了簡要解釋我的需求,我有一個使用者應該只在一個應該執行包含對外部數據庫的引用的儲存過程(在那個“授予”數據庫上)的數據庫上授予權限(我應該繼承一些授權)

詳細地說,我的情況是我有三個數據庫

  1. 配置數據庫(每個人都應該閱讀,但除了配置使用者之外,任何人都不能寫)
  2. 暫存數據庫(應由暫存過程讀取/寫入)
  3. 最終數據庫(應由應用程序讀取/寫入)

所以我有三個使用者

  1. 配置使用者:用於維護配置數據庫中的數據
  2. Staging User :由許多將數據放入 Staging DB 的 staging 過程(非常長的過程,可能需要數小時)使用
  3. 最終使用者:由在登台過程完成時讀取數據的應用程序用於在登台數據庫中部署數據並將其放回最終數據庫。最終使用者可以訪問每個數據庫(至少用於閱讀)

到目前為止一切順利,登台程序完成他們的工作,並在完成時編寫一個信號量(通知數據準備好)。有時應用程序(使用最終使用者)檢查信號量並將所有數據攝取到最終數據庫中。

現在我必須支持一個快速、按需的暫存過程(由於其他原因,我仍然需要從暫存數據庫執行),完成後,應該直接將數據更新到最終數據庫。

我已經編寫了這樣的程序並且一切都按預期工作,但是我必須將 FinalDB 上的讀/寫操作授予臨時使用者,我不喜歡它。有許多使用 Staging User 的應用程序,其中一些不是“在我的控制之下”,所以我不認為應該將數據寫入 Staging DB 的錯誤應用程序最終會弄亂 Final DB。我可以接受我的新的按需登台過程可能很關鍵(最終會弄亂最終數據庫)。

所以問題是,Staging User 已經被授予執行儲存過程(例如:OnDemandUpdate),因為它是 Staging DB 的一部分,但包含對外部表(來自 Final DB)的插入/更新,我希望授予可以是鍊式的。我怎樣才能做到這一點?

我認為您正在尋找的是跨數據庫所有權連結

跨數據庫所有權連結是所有權連結的擴展,但它確實跨越了數據庫邊界。

有關詳細資訊,請參閱Microsoft 的聯機叢書。可以只為單個數據庫打開它,這可能對您的案例更有意義:

您可以使用 ALTER DATABASE 語句的 SET 子句為單個數據庫設置跨數據庫所有權連結。如果要創建新數據庫,可以使用 CREATE DATABASE 語句為新數據庫設置跨數據庫所有權連結選項。


或者,另一種解決方案可能是使用該EXECUTE AS語句來模擬有權訪問Final數據庫中的表的登錄。

您可以將它放在Staging使用者有權執行的過程中,然後只有該過程有權修改Final數據庫中的表。

使用此解決方案,Staging使用者將需要訪問權限才能模擬正在使用的登錄名。這比直接授予使用者Final訪問權限要好,Staging因為您通過儲存過程控制數據庫,理想情況下,它將模擬的登錄在數據庫中只有有限的訪問權限(只是您需要更新的單個表?)Final

引用自:https://dba.stackexchange.com/questions/308115