用于复制连接的角色必须具有 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
到表所有者具有权限。但是,这也意味着拥有正在进行复制的表的任何用户都可以使用订阅所有者的权限执行任意代码。例如,他们可以通过简单地将触发器附加到他们拥有的其中一个表来做到这一点。由于通常不希望允许一个角色自由地承担另一个角色的权限,因此应避免此选项,除非数据库中的用户安全无关紧要。
在发布者上,权限仅在复制连接开始时检查一次,并在读取每个更改记录时不会重新检查。
在订阅者上,订阅所有者的权限在每次应用事务时重新检查。如果一个工作程序在应用事务时,订阅的所有权被并发事务更改,则当前事务的应用将继续在旧所有者的权限下进行。
如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用 此表格 报告文档问题。