用于复制连接的角色必须具备 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
的权限。但是,这也意味着任何拥有正在发生复制操作的表的所有者都可以使用订阅所有者的权限执行任意代码。例如,他们可以通过简单地附加触发器到他们拥有的其中一个表来执行上述操作。由于通常不愿意允许一个角色自由假冒其他角色的权限,因此应当避免使用此选项,除非数据库中的用户安全无关紧要。
在发布者上,只会在复制连接开始时检查权限,而不会在读取每个更改记录时重新检查权限。
在订阅者上,会在每笔交易被应用时重新检查订阅所有者的权限。如果在订阅的所有权被并发交易更改时某个工作进程正在应用某个交易,则当前交易的应用将继续在旧所有者的权限下进行。