14

情報スキーマの制約関連データにアクセスするには、関係の所有者である必要がありますか? 以下をテストしましたが、所有者である必要があるようです。

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
*/

私が関係の所有者でない場合、同じ情報を取得する方法は他にありますか?

4

3 に答える 3

24

これを使用してみてください..すべての制約名と制約の説明が表示されます。

  • 外部キー
  • 小切手
  • 主キー
  • 個性的

お気に入り:

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
于 2016-05-06T12:39:21.153 に答える
12

すべての制約関連データが「保護」されているわけではありません。クエリで 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その最後の行を削除すると、目的の結果が得られます。これは、基本的なメタデータがシステムによって保護されていないことを意味するため、良いことです。そのため、ビュー定義を削除して、本当に必要な部分だけを含めることができます。

于 2013-05-30T09:11:13.137 に答える