情報スキーマの制約関連データにアクセスするには、関係の所有者である必要がありますか?私は以下をテストしました、そして私は所有者でなければならないようです。
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
*/
私が関係の所有者でない場合、同じ情報を取得する方法は他にありますか?
すべての制約関連データが「保護」されるわけではありません。クエリでは3つの関係を使用します。
table_constraints
key_column_usage
constraint_column_usage
最初の2つは制限されていませんが、- constraint_column_usage
は次のように伝えます。
Constraint_column_usageビューは、いくつかの制約によって使用されている現在のデータベース内のすべての列を識別します。 現在有効になっているロールが所有するテーブルに含まれている列のみが表示されます。
information_schema.constraint_column_usage
はビューです。その定義は、
\d+ information_schema.constraint_column_usage
psqlシェルで。結果は一見恐ろしく見えますが、それほど悪くはありません。最初のテストで最も興味深いのは、最後の行の部分です。
WHERE pg_has_role(x.tblowner, 'USAGE'::text);
所有者以外が開いているpsqlシェルに定義を貼り付けた場合rights_test_role
と最後の行を削除すると、目的の結果が得られます。これは、基本的なメタデータがシステムによって保護されていないことを意味するため、問題ありません。そのため、ビュー定義を取り除いて、本当に必要な部分だけを含めることができます。
これを使用してみてください。すべての制約名と制約の説明が表示されます。
お気に入り:
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
関係制約をリストするには、次のクエリを使用できます。
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'