PostgreSQL:外键到角色OID

4

我该如何在Postgres数据库角色中添加外键?

CREATE TABLE "public"."role_info" (
    "last_login" timestamptz,
    "user" name,
    CONSTRAINT "role_info" FOREIGN KEY ("user") REFERENCES "pg_catalog"."pg_authid" ("rolname") ON UPDATE NO ACTION ON DELETE NO ACTION
 )
 WITH (OIDS=FALSE);

这个返回的是权限被拒绝

1个回答

7
在当前实现中,您不能添加引用系统目录的外键。即使以后对某些目录放宽了限制,像pg_role这样的全局目录也很可能保持受限。您可以使用触发器单向强制执行关系,防止添加引用不存在系统目录条目的值。但是,您无法阻止目录条目被删除,因此其效用有限。
自然系统在许多方面中特别处理系统目录关系使它们表现得很特别:
  • 有时会进行原位更新,这在用户关系中是不允许的,而且在事务中止时无法回滚
  • 通常通过间接层和缓存(syscache和relcache)访问它们
  • 使用一种不支持PostgreSQL的许多高级功能并出于性能、内存使用和代码复杂性的原因做出多个简化假设的特殊轻量级访问方法(genam)来更新它们。
此外,在pg_catalog.pg_authid的情况下,它是一个共享关系,您可以通过检查select relisshared from pg_catalog.pg_class where oid ='pg_catalog.pg_authid'::regclass看到这一点。这意味着相同的表内容映射到 PostgreSQL 实例(“集群”或数据目录)上的所有数据库中。无法 vern Vern Vern Vern Vern Vern Vern Vern Vern Vern 在另一个 DB 上存在 FK,因为引用它的关系将仅存在于pg_catalog.pg_class中的一个数据库中,其行所包含的堆也是如此。但是,被引用的 pg_catalog.pg_authid 堆会映射到所有数据库中。连接到一个DB的 postgres 后端不知道 FK 约束甚至在另一个 DB 上存在,并且没有检查的方法。

嗨,Craig,你知道最近的版本(v11,v12)中是否更改了此限制吗? 有没有一个地方可以详细记录/解释这个限制? - Dimitar Spasovski
1
不,它没有改变。我不知道有没有更详细的文档记录,但可能会有源代码注释。我还没有仔细研究那个领域。我已根据我从其他工作中了解到的一些原因进行了编辑并添加了说明。 - Craig Ringer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接