Postgresql:角色oid的外键

标签 postgresql postgresql-9.2

如何在 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);

这将返回permission denied

最佳答案

你不知道。您不能在当前实现中添加引用系统目录的外键。

即使稍后对某些目录放宽了该限制,所有数据库共享的全局目录(如 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 约束甚至存在于另一个数据库上,也无法检查。

关于Postgresql:角色oid的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15067770/

相关文章:

在 PostgreSQL C 函数中创建 int8[] 数组

javascript - 如何调试悬而未决的 promise ,而不是使用 node-postgres 解决 Postgres 查询?

ruby-on-rails-3.2 - 在 Ruby on Rails 3.2.14/Ruby 2.0.0/PostgreSQL 9.2.4 中使用 activerecord 从序列中检索 nextval

postgresql - Postgres 查询适用于 9.0 但不适用于 9.2

postgresql - 使用 ALTER SEQUENCE 后如何在 Postgres 中查看新的序列所有权信息?

postgresql - 如何在 postgresql 中使用时区更新日期时间字段

node.js - 如何在 knex.js 中使用 postgres::date

mysql - 将 MySQL 转储导入 Postgres 并转义\

locking - PostgreSql 更新插入 : which explicit locking method?

json - 如何在 PostgreSQL 9.2 中索引 JSON 数据?