2013-05-30 10 views
10

Farklı sahiplere sahip tüm tabloların listesi kısıtlamaları Bilgi şemasındaki kısıtlamalarla ilgili verilere erişmek için bir ilişki sahibi olmalı mıyım? Aşağıdakileri test ettim ve sahibi olmak zorundayım.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 
*/ 

İlişkinin sahibi olmadığım sürece aynı bilgileri nasıl alacağımın başka bir yolu var mı?

cevap

9

Kısıtlamayla ilgili tüm veriler "korunmamış" değil.

  • table_constraints
  • key_column_usage
  • constraint_column_usage

ilk iki sınırlı değildir, ama constraint_column_usage için dokümantasyon söyler: Sorgunuzda üç ilişkilerini kullanmak

View constraint_column_usage, geçerli dattaki tüm sütunları tanımlar Bazı kısıtlama tarafından kullanılan abase. Sadece etkin bir rolün sahip olduğu bir tabloda bulunan sütunlar gösterilir. information_schema.constraint_column_usage yana

bir görünümdür, sen psql'in kabuğunda

\d+ information_schema.constraint_column_usage 

kullanarak tanımını görebilirsiniz. Sonuç ilk bakışta korkutucu görünüyor ama gerçekten çok da kötü değil. Eğer sigara sahibinin rights_test_role tarafından açıktır psql'in kabuğu içine tanımını yapıştırın ve son satırını sizi silerseniz

WHERE pg_has_role(x.tblowner, 'USAGE'::text); 

: en ilginç şey - - Birinci test için çok son satırında parçasıdır istenilen sonucu alacaktır. Bu iyi, çünkü temel meta verilerin sistem tarafından korunmadığı anlamına gelir. Böylece, görünüm tanımını yalnızca gerçekten ihtiyacınız olan parçaları içerecek şekilde kapatabilirsiniz.

+2

'\ d +' arkadaşın. –

16

Bunu kullanmayı deneyin .. tüm kısıtlama adlarını ve kısıtlama tanımlarını verir.

  • Yabancı anahtar
  • Kontrol
  • Birincil anahtar
  • Benzersiz

gibi:

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