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