用于复制连接的角色必须具有REPLICATION
属性(或者是超级用户)。
如果角色缺少SUPERUSER
和 BYPASSRLS
,发布者的行安全策略可以执行。
如果角色不信任全部表所有者,则在连接字符串中包含options=-crow_security=off
;如果表所有者随后添加行安全策略,则该设置将导致复制中断,而不是执行该策略。
角色的访问权限必须在pg_hba.conf
中配置,并且必须具有LOGIN
属性。
为了能够拷贝初始表数据,用于复制连接的角色必须在被发布的表上具有SELECT
特权(或者是一个超级用户)。
要创建发布,用户必须在数据库中有CREATE
特权。
要向publication添加表格,用户必须对表格拥有所有权。要向publication添加模式中的所有表格, 用户必须是超级用户。要创建一个自动发布所有表格或模式中所有表格的publication, 用户必须是超级用户。
目前,出版物上没有任何权限。任何能够连接的订阅都可以访问任何出版物。 因此,如果您打算通过使用行过滤器或列列表,或者不将整个表添加到出版物中, 来隐藏某些信息以防止特定订阅者访问,请注意,同一数据库中的其他出版物 可能会暴露相同的信息。将来可能会在PostgreSQL 中添加出版物权限,以实现更细粒度的访问控制。
要创建订阅,用户必须拥有pg_create_subscription
角色的权限,
以及对数据库的CREATE
权限。
订阅应用过程将在会话级别以订阅所有者的权限运行。然而,当对特定表执行插入、
更新、删除或截断操作时,它将切换到表所有者的角色,并以表所有者的权限执行
操作。这意味着订阅所有者需要能够设置角色
为每个拥有复制表
的角色。
如果订阅已配置为run_as_owner = true
,则不会进行用户切换。
相反,所有操作都将以订阅所有者的权限执行。在这种情况下,订阅所有者只需
拥有对目标表的SELECT
、INSERT
、
UPDATE
和DELETE
权限,而不需要拥有
对表所有者的SET ROLE
权限。然而,这也意味着任何拥有
复制目标表的用户都可以利用订阅所有者的权限执行任意代码。例如,他们可以
通过简单地为他们拥有的表之一附加一个触发器来实现这一点。由于通常不希望
允许一个角色自由地假设另一个角色的权限,因此除非数据库中的用户安全性
无关紧要,否则应避免使用此选项。
在发布者端,权限仅在复制连接开始时检查一次,并且在读取每个更改记录时不会重新检查。
在订阅者端,每次应用时都会重新检查订阅所有者的特权。如果一个工作者正在应用事务时, 订阅的所有权被并发事务更改,当前事务的应用将在旧所有者的特权下继续。