[英]List constraints for all tables with different owners in PostgreSQL
我是否必须是信息架构中与访问约束相关的数据的关系的所有者? 我测试了以下内容,看来我必须是所有者。
create schema rights_test;
create table rights_test.t1 (id int primary key);
create table rights_test.t2 (id int references rights_test.t1(id));
select
tc.constraint_name,
tc.constraint_schema || '.' || tc.table_name || '.' || kcu.column_name as physical_full_name,
tc.constraint_schema,
tc.table_name,
kcu.column_name,
ccu.table_name as foreign_table_name,
ccu.column_name as foreign_column_name,
tc.constraint_type
from
information_schema.table_constraints as tc
join information_schema.key_column_usage as kcu on (tc.constraint_name = kcu.constraint_name and tc.table_name = kcu.table_name)
join information_schema.constraint_column_usage as ccu on ccu.constraint_name = tc.constraint_name
where
constraint_type in ('PRIMARY KEY','FOREIGN KEY')
and tc.constraint_schema = 'rights_test'
/*
This will produce desired output:
t1_pkey;rights_test.t1.id;rights_test;t1;id;t1;id;PRIMARY KEY
t2_id_fkey;rights_test.t2.id;rights_test;t2;id;t1;id;FOREIGN KEY
*/
create user rights_test_role with password 'password';
grant all on rights_test.t1 to rights_test_role;
grant all on rights_test.t2 to rights_test_role;
/* Now login as rights_test_role and try the same constraint select.
For rights_test_role it returns nothing although I've added ALL privileges
*/
如果我不是该关系的所有者,还有其他方法如何获取相同的信息?
尝试使用此..给出所有约束名称和约束描述。
喜欢:
select conrelid::regclass AS table_from, conname, pg_get_constraintdef(c.oid)
from pg_constraint c
join pg_namespace n ON n.oid = c.connamespace
where contype in ('f', 'p','c','u') order by contype
并非所有与约束相关的数据都是“受保护的”。 您在查询中使用三个关系:
table_constraints
key_column_usage
constraint_column_usage
前两个没有限制,但是constraint_column_usage
的文档告诉您:
视图constraint_column_usage标识当前数据库中由某些约束使用的所有列。 仅显示当前启用角色拥有的表中包含的那些列。
由于information_schema.constraint_column_usage
是一个视图,因此可以使用以下命令查看其定义
\d+ information_schema.constraint_column_usage
在psql shell中。 乍一看,结果似乎令人恐惧,但实际上还不错。 对于第一个测试,最有趣的是最后一行中的部分:
WHERE pg_has_role(x.tblowner, 'USAGE'::text);
如果将定义粘贴到由非所有者rights_test_role
打开的psql shell中并删除最后一行,您将获得所需的结果。 这很好,因为这意味着基本元数据不受系统保护。 因此,您可以精简视图定义以仅包括您真正需要的部分。
要列出关系约束,可以使用下一个查询:
SELECT
tc.constraint_name, tc.table_name, kcu.column_name,
ccu.table_name AS foreign_table_name,
ccu.column_name AS foreign_column_name
FROM
information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu
ON tc.constraint_name = kcu.constraint_name
JOIN information_schema.constraint_column_usage AS ccu
ON ccu.constraint_name = tc.constraint_name
WHERE constraint_type = 'FOREIGN KEY'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.