文档说
如果订阅已配置 run_as_owner = true,则不会发生用户切换。相反,所有操作都将在订阅所有者的权限下执行。在这种情况下,订阅所有者只需要对目标表进行 SELECT、INSERT、UPDATE 和 DELETE 的权限,而不需要对表所有者设置 ROLE 的权限。但是,这也意味着拥有正在复制的表的任何用户都可以使用订阅所有者的权限执行任意代码。例如,他们可以通过简单地将触发器附加到他们拥有的表之一来完成此操作。由于通常不希望允许一个角色自由地承担另一个角色的权限,因此应避免使用此选项,除非不关心数据库内的用户安全。
我不确定我是否理解为什么这是一个安全风险。表所有者不是总是可以强制使用其表的角色执行代码吗?我天真的直觉是,表所有者是一个敏感角色,正是因为它具有这些权限,而订阅所有者角色可以具有非常严格的权限(仅对其表进行 CRUD),为什么这种直觉是错误的?
风险是相反的。如果您是非特权用户并拥有一个通过订阅将数据复制到的表,则可以在该表上创建一个触发器并将其定义为副本触发器。然后,当逻辑复制应用工作线程在您的表上执行 DML 语句以应用某些更改时,您的触发器函数将在订阅所有者的上下文中执行。这意味着您(非特权表所有者)可以使拥有订阅的特权用户执行您喜欢的任何代码。