PostgreSQL 中 pg_catalog 表的外键

Séb*_*ent 6 sql postgresql

是否可以有一个外键指向系统目录(pg_catalog)表的字段?

当我尝试以下操作时:

ALTER TABLE my_table ADD CONSTRAINT fk_my_table FOREIGN KEY (role_name) REFERENCES pg_roles(rolname) ON UPDATE CASCADE;
Run Code Online (Sandbox Code Playgroud)

我得到:

ERROR:  referenced relation "pg_roles" is not a table
Run Code Online (Sandbox Code Playgroud)

sol*_*anv 7

这是不可能的。
如果您尝试使用系统表,您将收到类似错误

  ********** Error **********
    ERROR: permission denied: "pg_attribute" is a system catalog
    SQL state: 42501
Run Code Online (Sandbox Code Playgroud)

即使您覆盖该权限,系统也不会强制执行该约束。所以我们不能用系统表引用创建约束。

如果你的角色很少,那么请进行手动检查或从 pg_roles 创建临时表,然后进行约束。

create temp table test1 as select * from pg_roles 
Run Code Online (Sandbox Code Playgroud)

  • 对于新条目:创建触发器并检查 pg_roles 中是否存在给定角色,如果存在则添加记录。 (2认同)