用於複製連線的角色必須具有 REPLICATION
屬性(或為超級使用者)。如果該角色缺少 SUPERUSER
和 BYPASSRLS
,則可以執行發布者的資料列安全性原則。如果該角色不信任所有資料表擁有者,請在連線字串中包含 options=-crow_security=off
;如果資料表擁有者隨後新增資料列安全性原則,該設定將導致複製停止,而不是執行該原則。必須在 pg_hba.conf
中設定該角色的存取權,並且該角色必須具有 LOGIN
屬性。
為了能夠複製初始資料表資料,用於複製連線的角色必須在已發布的資料表上具有 SELECT
權限(或為超級使用者)。
若要建立發布,使用者必須在資料庫中具有 CREATE
權限。
若要將資料表新增至發布,使用者必須擁有該資料表的所有權。若要將綱要中的所有資料表新增至發布,使用者必須是超級使用者。若要建立自動發布所有資料表或綱要中所有資料表的發布,使用者必須是超級使用者。
目前發布沒有權限。任何訂閱(能夠連線的)都可以存取任何發布。因此,如果您打算向特定訂閱者隱藏某些資訊,例如透過使用資料列篩選器或欄位清單,或透過不將整個資料表新增至發布,請注意,同一個資料庫中的其他發布可能會暴露相同的資訊。發布權限可能會在未來新增至 PostgreSQL,以便進行更精細的存取控制。
若要建立訂閱,使用者必須具有 pg_create_subscription
角色的權限,以及資料庫的 CREATE
權限。
訂閱應用程式程序會在工作階段層級,以訂閱擁有者的權限執行。但是,在特定資料表上執行插入、更新、刪除或截斷操作時,它會將角色切換為資料表擁有者,並以資料表擁有者的權限執行操作。這表示訂閱擁有者必須能夠 SET ROLE
至擁有已複製資料表的每個角色。
如果訂閱已設定為 run_as_owner = true
,則不會發生使用者切換。相反地,所有操作都將以訂閱擁有者的權限執行。在這種情況下,訂閱擁有者只需要從目標資料表 SELECT
、INSERT
、UPDATE
和 DELETE
的權限,而不需要 SET ROLE
至資料表擁有者的權限。然而,這也表示擁有資料表(複製正在發生的資料表)的任何使用者都可以使用訂閱擁有者的權限執行任意程式碼。例如,他們可以透過簡單地將觸發程序附加到他們擁有的其中一個資料表來做到這一點。因為通常不希望允許一個角色隨意假定另一個角色的權限,所以除非資料庫中的使用者安全性並不重要,否則應避免此選項。
在發布者上,權限僅在複製連線開始時檢查一次,並且不會在讀取每個變更記錄時重新檢查。
在訂閱者上,訂閱擁有者的權限會在每次套用時針對每個交易重新檢查。如果工作程序在套用交易的過程中,訂閱的所有權因並行交易而變更,則目前交易的應用程式將繼續在舊擁有者的權限下進行。
如果您在文件中看到任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的內容,請使用 此表單來報告文件問題。