PostgreSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпред рднрд╛рдЧ рджреЛ

рдпрд╣ рд▓реЗрдЦ рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ рд╣реИ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ: pg_class, pg_attribute, pg_constraints, рдЖрджрд┐ред

рд▓реЗрдЦ рдХрд╛ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдмрд╛рдзрд╛рдУрдВ рдФрд░ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ ред

рд▓реЗрдЦ рдХреА рдкрд╣рд▓реА рдЫрдорд╛рд╣реА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рджреВрд╕рд░рд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИред рдЙрди рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреЗрд╡рд▓ рд╕реНрд░реЛрдд рдЧреНрд░рдВрдереЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рд╣рдо рддреБрд░рдВрдд рдкрд░рд┐рд╢рд┐рд╖реНрдЯ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВред

рдпрд╣ рднреА рджреЗрдЦреЗрдВ
PostgreSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпред рднрд╛рдЧ рдПрдХ ;
PostgreSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпред рднрд╛рдЧ рддреАрди
PostgreSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпред рдЕрдВрдд (рднрд╛рдЧ рдЪрд╛рд░) ред

рдбреЗрдЯрд╛рдмреЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдФрд░ рдЙрдирдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рд╕реВрдЪреА adtf_Table_Constraintes



Admtf_Table_Constraintes рдлрд╝рдВрдХреНрд╢рди рдбреЗрдЯрд╛рдмреЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдФрд░ рдЙрдирдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдХрдореА (CONSTRAINT) рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИред рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдпрд╣рд╛рдВ рджреЗрдЦрд╛ рдФрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рдФрд░ рдпрд╣рд╛рдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬреЛ рдХрд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред



рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рд╕реНрд░реЛрдд рддрд╛рд▓рд┐рдХрд╛ ( a_TableName ) рдФрд░ рдЙрд╕ рдпреЛрдЬрдирд╛ рдХрд╛ рдирд╛рдо рд▓реЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рднреАрддрд░ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ ( a_SchemaName )ред

рдПрдХ рд╡рд┐рд╢реЗрд╖ рдмрд╛рдзрд╛ рдХрд╛ рд╡рд░реНрдгрди pg_class рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдПрдХ рд╕рдВрдпреЛрдЬрди рд╣реИ рдЬреЛ рдЗрд╕реЗ рд╢рд╛рд░реАрд░рд┐рдХ рд╕рдВрдмрдВрдз рдХреЗ рд░реВрдк рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдФрд░ pg_constraint рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдмрд╛рдзрд╛ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИред




рдЖрдХреГрддрд┐ рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб
SELECT tbl.OID,con.conname,con.contype,con.conkey,reftbl.OID, reftbl.relname,con.confkey,con.consrc FROM pg_constraint con INNER JOIN pg_namespace nsp ON con.connamespace=nsp.oid LEFT OUTER JOIN pg_class tbl ON con.conrelid=tbl.oid LEFT OUTER JOIN pg_class reftbl ON con.confrelid=reftbl.oid WHERE LOWER(nsp.nspname)=LOWER(a_SchemaName) AND LOWER(tbl.relname)=LOWER(a_TableOID) ORDER BY con.contype DESC,con.conname; 


рдореБрдЦреНрдп рдбреЗрдЯрд╛ (рдкреНрд░рддрд┐рдмрдВрдз рдХрд╛ рдирд╛рдо рдФрд░ рдкреНрд░рдХрд╛рд░) pg_constraint рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╕реЗ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдзрд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдПрдХ рд╣реА рдХреИрдЯрд▓реЙрдЧ рд╕реЗ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдУрдЖрдИрдбреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ( рдХрд╕рдирд╛ , рдЧреЛрдкрдиреАрдп ) рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ ( рд╢рдВрдХреБ , рдХрдВрдлреЗрдЯ ) рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдмрд╛рдзрд╛ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдирд╛ред



рдлрд╝рдВрдХреНрд╢рди рддрд╛рд▓рд┐рдХрд╛ рдирд╛рдореЛрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдзрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рддрд╛рд▓рд┐рдХрд╛ рдирд╛рдо рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (OID) рджреНрд╡рд╛рд░рд╛ pg_class рдХреИрдЯрд▓реЙрдЧ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╕реЗ рдирд┐рдХрд╛рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рджреНрд╡рд╛рд░рд╛ pg_attribute рдХреИрдЯрд▓реЙрдЧ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╛рдоред рдХреНрдпреЛрдВрдХрд┐ рдЪреВрдВрдХрд┐ рд╕реАрд░рд┐рдпрд▓ рдирдВрдмрд░ рдПрдХ рд╕рд░рдгреА (рд╕реВрдЪреА) рдХреЗ рд░реВрдк рдореЗрдВ рдореБрдЦреНрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдПрдХ рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╛рдореЛрдВ рдХреА рд╕реВрдЪреА рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред


рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рд╢реЗрд╖рддрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ - рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ (CHECK рдкреНрд░рддрд┐рдмрдВрдз) рдореЗрдВ рдлрд╝реАрд▓реНрдб рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдоред рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ pg_constraint рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдХрдВрд╕реЛрд▓ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдкрд╛рда рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред


рддрд╛рд▓рд┐рдХрд╛ 7. рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо adtf_Table_Constraintes ('рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ', 'рд╕реНрдЯреНрд░реАрдЯ')ред

рдЖрдХреГрддрд┐ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдкрд╛рда рд╕рдВрд╕реНрдХрд░рдг
рдирд╛рдордЯрд╛рдЗрдкрд╕реНрд░реЛрдд рддрд╛рд▓рд┐рдХрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБрдмрд╛рд╣рд░реА рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдирд╛рдордПрдХ рдмрд╛рд╣рд░реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдЧреБрдгрдорд╛рдиреНрдпрддрд╛ рдирд┐рдпрдо
xpkstreetрдкреАwcrccode, localityid, streetid
fk_street_localityрдЪwcrccode, рд╕реНрдерд╛рдиреАрдпрддрд╛рдЗрд▓рд╛рдХреЗwcrccode, рд╕реНрдерд╛рдиреАрдпрддрд╛
fk_street_streettypeрдЪstreettypeacrmstreettypestreettypeacrm
ck_street_streetnameрдЧstreetname((рд╕рдбрд╝рдХ рдХрд╛ рдирд╛рдо) :: рдкрд╛рда! ~ * '[az]' :: рдкрд╛рда)
ck_street_streettypeacrmрдЧstreettypeacrm((Streettypeacrm) :: bpchar! ~ * '[az]' :: рдЯреЗрдХреНрд╕реНрдЯ)



рд╕рдВрд╕реНрдХрд░рдг рдХрд░реНрд╕рд░ рдХреЗ рдмрд┐рдирд╛


рдореИрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореБрдЦреНрдп рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрд░реНрд╕рд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдкреНрд░рд╢реНрдиреЛрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рддрд╛ рд╣реВрдВред


рдореИрдВ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреВрдВрдЧрд╛ - рд╕реНрд╡рд╛рдж рдФрд░ рд░рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХреЙрдорд░реЗрдб рдирд╣реАрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдХрд░реНрд╕рд░ рдХреЗ рдмрд┐рдирд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рджреВрдВрдЧрд╛ред рдХрд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдпрд╣рд╛рдВ рджреЗрдЦрд╛ рдФрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред


рдореБрдЦреНрдп рдХрдард┐рдирд╛рдИ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд╕рд░рдгреА рдХреЗ рдЧреБрдг рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╕реНрдерд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдЬреБрдбрд╝рдиреЗ (рдЬреЙрдЗрди) рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд░рдгрд┐рдпрд╛рдБ рд╢рдВрдХреБ рдФрд░ рдХрдиреНрдлрд╝реЗрдХреНрдЯ рд╣реИрдВ ред



 SELECT c.conname,c.contype,c.conkey::SMALLINT[], GENERATE_SUBSCRIPTS(c.conkey, 1) as No FROM pg_constraint c WHERE c.conname='fk_street_locality' ORDER BY No; 

рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, PostgrSQL рдореЗрдВ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдПрд░реЗ рддрддреНрд╡реЛрдВ рдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, generate_subscripts рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рди рдХреЗрд╡рд▓ рдпрд╣ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рд╕рд░рдгреА рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдВрдХреЗрдд рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕рд░рдгреА рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдХрдИ рдореЗрдВ рд╕рд░рдгреА рд╡рд╛рд▓реЗ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рднреА рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдРрд╕реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдХреЙрд░реНрдб рдореЗрдВ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИ - рд╕рд░рдгреА рдХреА рд╕реНрдерд┐рддрд┐ред



рддрд╛рд▓рд┐рдХрд╛ 8. рдЬрдирд░реЗрдЯ_ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореВрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдкреНрд░рдЪрд╛рд░ рдХрд░рдирд╛ред

рдкреНрд░рддрд┐рдмрдВрдз рдХрд╛ рдирд╛рдордЯрд╛рдЗрдкрд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рдВрдЦреНрдпрд╛ рдХреА рд╕рд░рдгреАрдПрдХ рд╕рд░рдгреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ
fk_street_localityрдЪ{1,2}1
fk_street_localityрдЪ{1,2}2



рдЖрдХреГрддрд┐ рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб
 SELECT con.conname AS ConstraintName,con.contype::VARCHAR(2) AS ConstraintType, STRING_AGG(attr.attname, ', 'ORDER BY con.No) AS r_ConstraintKeyNames, reftbl.relname AS RefTableName, STRING_AGG(rattr.attname,', 'ORDER BY con.No) AS r_RefTableKeyNames, con.consrc AS ConstraintSource FROM (SELECT c.oid, c.conrelid,c.confrelid,c.conname,c.contype, c.conkey::SMALLINT[],c.consrc, c.confkey::SMALLINT[], generate_subscripts(c.conkey, 1) as No FROM pg_constraint c) con INNER JOIN pg_class tbl ON con.conrelid=tbl.oid INNER JOIN pg_attribute attr ON attr.attrelid=tbl.oid AND attr.attnum=con.conkey[con.No] INNER JOIN pg_namespace nsp ON tbl.relnamespace=nsp.oid LEFT OUTER JOIN pg_class reftbl ON con.confrelid=reftbl.oid LEFT OUTER JOIN pg_attribute rattr ON rattr.attrelid=reftbl.oid AND rattr.attnum=con.confkey[con.No] WHERE LOWER(nsp.nspname)=LOWER(a_SchemaName) AND LOWER(tbl.relname)=LOWER(a_TableName) GROUP BY con.conname,con.contype,reftbl.relname,con.consrc ORDER BY con.contype DESC,con.conname; 


рдРрд╕реА рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╣рд╛рд▓рдд attr.attrelid = tbl.oid рдФрд░ attr.attnum = con.conkey [con.No] рдХреЗ рддрд╣рдд рдЗрд╕рдореЗрдВ рд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╛рдо рдирд┐рдХрд╛рд▓рдХрд░ pg_attribute рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреИрдЯрд▓реЙрдЧ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдм рдпрд╣ рд░рд┐рдХреЙрд░реНрдбреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ, рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╛рдореЛрдВ рд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрдирд╛рддрд╛ рд╣реИред


рдПрдХ рдкрдВрдХреНрддрд┐ рдмрдирд╛рдирд╛ рдПрдХрддреНрд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди STRING_AGG рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдк (ORDER BY) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЕрдиреНрдпрдерд╛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рдХреНрд░рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдХреНрд░рдо рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред



рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 20 рдПрдордПрд╕ рд▓рд┐рдпрд╛ рдЧрдпрд╛ред


Admtf_Table_Indexes рдбреЗрдЯрд╛рдмреЗрд╕ рдЯреЗрдмрд▓ рдЗрдВрдбреЗрдХреНрд╕ рдФрд░ рдЙрдирдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдлрд╝рдВрдХреНрд╢рди рд╕реВрдЪреА



Admtf_Table_Indexes рдлрд╝рдВрдХреНрд╢рди рдбреЗрдЯрд╛рдмреЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреА рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ (INDEX) рдФрд░ рдЙрдирдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИред рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдпрд╣рд╛рдВ рджреЗрдЦрд╛ рдФрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рдФрд░ рдпрд╣рд╛рдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬреЛ рдХрд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред


рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рд╕реНрд░реЛрдд рддрд╛рд▓рд┐рдХрд╛ ( a_TableName ) рдФрд░ рдЙрд╕ рдпреЛрдЬрдирд╛ рдХрд╛ рдирд╛рдо рд▓реЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рднреАрддрд░ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ ( a_SchemaName )ред

рдЖрдХреГрддрд┐ рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб
 SELECT tbl.oid,inxcls.relname,inxam.amname,inx.indisunique,inx.indisprimary, inx.indkey::SMALLINT[],inx.indoption::SMALLINT[],inxam.amcanorder FROM pg_index inx INNER JOIN pg_class inxcls ON inx.indexrelid=inxcls.oid INNER JOIN pg_namespace inxnsp ON inxcls.relnamespace=inxnsp.oid INNER JOIN pg_am inxam ON inxcls.relam=inxam.oid INNER JOIN pg_class tbl ON inx.indrelid=tbl.oid INNER JOIN pg_namespace nsp ON tbl.relnamespace=nsp.oid WHERE LOWER(nsp.nspname)=LOWER(a_SchemaName) AND LOWER(tbl.relname)=LOWER(a_TableOID) ORDER BY inxam.amname, inxcls.relname; 


рдПрдХрд▓ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рд╡рд░реНрдгрди pg_class рдореЗрдВ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рд╕рдВрдпреЛрдЬрди рд╣реИ, рдЬреЛ рдЗрд╕реЗ рд╢рд╛рд░реАрд░рд┐рдХ рд╕рдВрдмрдВрдз рдХреЗ рд░реВрдк рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдФрд░ pg_index рдореЗрдВ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рдбреЗрдЯрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рд╕реВрдЪрдХрд╛рдВрдХ рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА pg_am рд╕рд┐рд╕реНрдЯрдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИред


 CASE inxam.amcanorder WHEN true THEN CASE inx.indoption[inx.No] & 1 WHEN 1 THEN ' DESC' ELSE ' ASC' END ELSE '' END; 

рд╕реВрдЪрдХрд╛рдВрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ ( рдЗрдВрдбрд┐рд╕реБрдирд┐рдХ ) рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛, рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА ( рдЕрдиреБрд╢рд╛рд╕рдирд╣реАрдирддрд╛ ) рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рддрд╛рд▓рд┐рдХрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ, рдЬрд┐рдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реВрдЪрдХрд╛рдВрдХ ( рдЗрдВрдбреЗрдХ ) рдФрд░ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рдиреЛрдВ рдХреЗ рдХреНрд░рдо рдХреЗ рд╕рдВрдХреЗрддреЛрдВ рдХреЛ pg_index рдХреИрдЯрд▓реЙрдЧ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╕реЗ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрдВрдбреЗрдХреНрд╕ ( рдЗрдВрдбреЛрдкреЗрд╢рди ) рдореЗрдВред


Pg_am рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдХреА рдкрд╣реБрдБрдЪ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХреИрдЯрд▓реЙрдЧ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╕реЗ, рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ ( amcanorder ) рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреА рдЙрдкрдпреБрдХреНрддрддрд╛ рдФрд░ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдкрд╣реБрдБрдЪ рд╡рд┐рдзрд┐ (рдирд╛рдо) рдХрд╛ рдирд╛рдо рдпрд╛ рдкреНрд░рдХрд╛рд░ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ ред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, amcanorder рд╡рд┐рд╢реЗрд╖рддрд╛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд░рдо рдХреНрд░рдо рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдпрджрд┐ amcanorder = true , рддреЛ рд╕реЙрд░реНрдЯ рдХреНрд░рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдирд╣реАрдВред рдПрдХ рд╣реА рдЖрдХреГрддрд┐ рд╕реЗ, рджрддреНрддрдХ рдЧреНрд░рд╣рдг рд╕рд░рдгреА рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЕрд░реНрде рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ - рдпрджрд┐ рдореВрд▓реНрдп рдХреЗ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд░реВрдк рдХреЗ рд╕рд╣реА рдмрд┐рдЯ рдореЗрдВ 1 рдмреА рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдореВрд▓реНрдп рдЕрд╡рд░реЛрд╣реА рдХреНрд░рдо рдореЗрдВ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ - рдЖрд░реЛрд╣реА рдХреНрд░рдо рдореЗрдВред


рд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреА рд╕реВрдЪреА, рд╕рд╛рде рд╣реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдорд╛рдиреЛрдВ рдХреЗ рдХреНрд░рдо рдХреЗ рд╕рдВрдХреЗрдд, рдЪрдХреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред



рддрд╛рд▓рд┐рдХрд╛ 9. рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо adtf_Table_Indexes ('рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ', 'рд╕реНрдЯреНрд░реАрдЯ')ред


рдЖрдХреГрддрд┐ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдкрд╛рда рд╕рдВрд╕реНрдХрд░рдг
рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдирд╛рдорд╡рд┐рдзрд┐? рдЕрджреНрд╡рд┐рддреАрдп? рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреАрд╕реВрдЪрдХрд╛рдВрдХ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ
xie1streetBTREEрдЪрдЪwcrccode ASC, localityid ASC, streettypeacrm ASC, streetname ASC
xie2streeBTREEрдЪрдЪwcrccode ASC, рдЗрд▓рд╛рдХреЗ рдХрд╛ ASC, рд╕рдбрд╝рдХ рдХрд╛ рдирд╛рдо ASC
xie3streetBTREEрдЪрдЪрд╕рдбрд╝рдХ рдХрд╛ рдирд╛рдо ASC
xie9streetBTREEрдЪрдЪwcrccode ASC, рдЗрд▓рд╛рдХреЗ рдХрд╛ ASC, рд╕рдбрд╝рдХ рдХрд╛ рдирд╛рдо DESC
xpkstreetBTREEрдЯреАрдЯреАwcrccode ASC, рдЗрд▓рд╛рдХреЗ рдХрд╛ ASC, рд╕рдбрд╝рдХ рдХрд╛ ASC
xts1streetрдЬрд┐рдирдЪрдЪstreettsvector
xts2streetрдЬрд┐рдирдЪрдЪstreettsvector


рд╕рдВрд╕реНрдХрд░рдг рдХрд░реНрд╕рд░ рдХреЗ рдмрд┐рдирд╛


рдПрдХ рдХрд░реНрд╕рд░ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдиреЗ рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ:


  • рдЬрдирд░реЗрдЯ_рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдкреБрдирд░реБрддреНрдкрд╛рджрди
  • рдмрд╛рдж рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рд╕рдореВрд╣рди;
  • ORDER BY рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде STRING_AGG рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдирд╛ред


рдЖрдХреГрддрд┐ рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб
 SELECT inxcls.relname AS r_IndexName ,inxam.amname AS r_IndexType, inx.indisunique AS r_isUnique,inx.indisprimary AS r_isPrimary, STRING_AGG(attr.attname|| CASE inxam.amcanorder WHEN true THEN CASE inx.indoption[inx.No] & 1 WHEN 1 THEN ' DESC' ELSE ' ASC' END ELSE '' END, c_Delimiter ORDER BY inx.No) FROM (SELECT i.indrelid, i.indexrelid,i.indisunique,i.indisprimary, i.indkey::SMALLINT[],i.indoption::SMALLINT[], generate_subscripts(i.indkey, 1) as No FROM pg_index i) inx INNER JOIN pg_class inxcls ON inx.indexrelid=inxcls.oid INNER JOIN pg_am inxam ON inxcls.relam=inxam.oid INNER JOIN pg_class tbl ON inx.indrelid=tbl.oid INNER JOIN pg_namespace nsp ON tbl.relnamespace=nsp.oid INNER JOIN pg_attribute attr ON attr.attrelid=tbl.OID AND attr.attnum=inx.indkey[inx.No] WHERE LOWER(nsp.nspname)=LOWER(a_SchemaName) AND LOWER(tbl.relname)=LOWER(a_TableName) GROUP BY inxcls.relname,inxam.amname,inx.indisunique,inx.indisprimary ORDER BY inxcls.relname; 



рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ 20 рдПрдордПрд╕ рд▓рд┐рдпрд╛ рдЧрдпрд╛ред


рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЕрдм рдлрд╝рдВрдХреНрд╢рди рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рдмрдирд╛рдКрдВрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЬреЛ рд▓реЛрдЧ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рдЙрдирдХреА рдкрд╕рдВрдж рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд░реАрдореЗрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдореБрдЭрд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВ рдореБрдлреНрдд рдореЗрдВ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рд╕рдВрд╕реНрдХрд░рдг рднреЗрдЬреВрдВрдЧрд╛ ред

рдпрд╣ рднреА рджреЗрдЦреЗрдВ рдкрд╣рд▓реЗ , рддреАрд╕рд░реЗ рдФрд░ рдЪреМрдереЗ рд▓реЗрдЦ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред



рдкрд░рд┐рд╢рд┐рд╖реНрдЯ 1. рд▓рд┐рдкрд┐рдпреЛрдВ



Adtf_Table_Constraintes рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдирд╛


рдлрд╝рдВрдХреНрд╢рди рд╕реНрд░реЛрдд рдХреЛрдб рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдпрд╣рд╛рдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред
рдлрд╝рдВрдХреНрд╢рди рд╕реНрд░реЛрдд рдХреЛрдб
 BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_Constraintes (a_SchemaName NAME, a_TableName NAME); /********************************************************************************************************/ /*      */ /********************************************************************************************************/ CREATE OR REPLACE FUNCTION admtf_Table_Constraintes (a_SchemaName name default 'public', /*     */ a_TableName name default NULL /*   */ ) RETURNS TABLE (r_ConstraintName NAME,r_ConstraintType NAME,r_ConstraintKeyNames Text,r_RefTableName NAME,r_RefTableKeyNames Text,r_ConstraintSource Text) AS $BODY$ DECLARE v_Scale INTEGER; /*   */ v_ConstraintRec RECORD; /*   */ v_TableOID INTEGER; /* OID */ v_ConstraintOID INTEGER; /* OID */ v_ConstraintKeyNos SMALLINT[]; /* */ v_ConstraintName name; /*   */ v_ConstraintType name; /*     */ v_isUnique BOOLEAN; /*   */ v_isPrimary BOOLEAN; /*      Primary KEY */ v_AttributeNum INTEGER; /*   */ v_AttributeName name; /*  */ v_ConstraintKeyNames TEXT; /*     */ v_RefTableOID INTEGER; /* OID ,     */ v_RefTableName name;/*  ,     */ v_RefTableKeyNos SMALLINT[]; /* */ v_RefTableKeyNames TEXT; /*     ,    */ v_ConstraintSource TEXT; /*     CHECK*/ c_Delimiter CONSTANT VARCHAR(2):=','; --****************************************************************************************************** BEGIN FOR v_ConstraintRec IN SELECT con.oid AS ConstraintOID ,tbl.OID AS TableOID, con.conname AS ConstraintName, con.contype AS ConstraintType, con.conkey AS ConstraintKeyNos, reftbl.OID AS RefTableOID, reftbl.relname AS RefTableName, con.confkey AS RefTableKeyNos, con.consrc AS ConstraintSource FROM pg_constraint con INNER JOIN pg_class tbl ON con.conrelid=tbl.oid INNER JOIN pg_namespace nsp ON tbl.relnamespace=nsp.oid LEFT OUTER JOIN pg_class reftbl ON con.confrelid=reftbl.oid WHERE LOWER(nsp.nspname)=LOWER(a_SchemaName) AND LOWER(tbl.relname)=LOWER(a_TableName) ORDER BY con.contype DESC,con.conname LOOP v_ConstraintOID:=v_ConstraintRec.ConstraintOID; v_TableOID:=v_ConstraintRec.TableOID; v_ConstraintName:=v_ConstraintRec.ConstraintName; v_ConstraintType:=v_ConstraintRec.ConstraintType; v_ConstraintKeyNos:=v_ConstraintRec.ConstraintKeyNos; v_RefTableOID:=v_ConstraintRec.RefTableOID; v_RefTableName:=v_ConstraintRec.RefTableName; v_RefTableKeyNos:=v_ConstraintRec.RefTableKeyNos; v_ConstraintSource:=v_ConstraintRec.ConstraintSource; v_ConstraintKeyNames:=''; FOREACH v_AttributeNum IN ARRAY v_ConstraintKeyNos LOOP SELECT INTO v_AttributeName attr.attname::VARCHAR(100) AS r_AttributeName FROM pg_attribute attr WHERE attr.attrelid=v_TableOID AND attr.attnum=v_AttributeNum; v_ConstraintKeyNames:=v_ConstraintKeyNames|| CASE WHEN v_ConstraintKeyNames='' THEN '' ELSE c_Delimiter END ||v_AttributeName; END LOOP; v_RefTableKeyNames:=''; IF v_RefTableKeyNos IS NOT NULL THEN FOREACH v_AttributeNum IN ARRAY v_RefTableKeyNos LOOP SELECT INTO v_AttributeName attr.attname::VARCHAR(100) AS r_AttributeName FROM pg_attribute attr WHERE attr.attrelid=v_RefTableOID AND attr.attnum=v_AttributeNum; v_RefTableKeyNames:=v_RefTableKeyNames|| CASE WHEN v_RefTableKeyNames='' THEN '' ELSE c_Delimiter END ||v_AttributeName; END LOOP; END IF; RETURN QUERY SELECT v_ConstraintName,v_ConstraintType,v_ConstraintKeyNames, v_RefTableName,v_RefTableKeyNames, v_ConstraintSource; END LOOP; RETURN; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_Constraintes(a_SchemaName NAME, a_TableName NAME) IS '    '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_Constraintes (a_SchemaName VARCHAR(256), a_TableName VARCHAR(256)); /********************************************************************************************************/ /*      */ /********************************************************************************************************/ CREATE OR REPLACE FUNCTION admtf_Table_Constraintes (a_SchemaName VARCHAR(256) default 'public', /*     */ a_TableName VARCHAR(256) default NULL /*   */ ) RETURNS TABLE (r_ConstraintName VARCHAR(256),r_ConstraintType VARCHAR(256),r_ConstraintKeyNames Text,r_RefTableName VARCHAR(256),r_RefTableKeyNames Text,r_ConstraintSource Text) AS $BODY$ DECLARE --****************************************************************************************************** BEGIN RETURN QUERY SELECT tc.r_ConstraintName::VARCHAR(256), tc.r_ConstraintType::VARCHAR(256),tc.r_ConstraintKeyNames::TEXT, tc.r_RefTableName::VARCHAR(256),tc.r_RefTableKeyNames::TEXT, tc.r_ConstraintSource::TEXT FROM admtf_Table_Constraintes(a_SchemaName::NAME,a_TableName::NAME) tc; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_Constraintes(a_SchemaName VARCHAR(256), a_TableName VARCHAR(256)) IS '    '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; SELECT * FROM admtf_Table_Constraintes('public'::VARCHAR(256),'Street'::VARCHAR(256)); SELECT * FROM admtf_Table_Constraintes('public'::name,'Street'::name); 



рдПрдХ рдХрд░реНрд╕рд░ рдХреЗ рдмрд┐рдирд╛ admtf_Table_Constraintes рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдирд╛


рдлрд╝рдВрдХреНрд╢рди рд╕реНрд░реЛрдд рдХреЛрдб рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдпрд╣рд╛рдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред
рдлрд╝рдВрдХреНрд╢рди рд╕реНрд░реЛрдд рдХреЛрдб
 BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_Constraintes (a_SchemaName NAME, a_TableName NAME); /********************************************************************************************************/ /*      */ /********************************************************************************************************/ CREATE OR REPLACE FUNCTION admtf_Table_Constraintes (a_SchemaName name default 'public', /*     */ a_TableName name default NULL /*   */ ) RETURNS TABLE (r_ConstraintName NAME,r_ConstraintType NAME,r_ConstraintKeyNames Text,r_RefTableName NAME,r_RefTableKeyNames Text,r_ConstraintSource Text) AS $BODY$ DECLARE v_Scale INTEGER; /*   */ v_ConstraintRec RECORD; /*   */ v_TableOID INTEGER; /* OID */ v_ConstraintOID INTEGER; /* OID */ v_ConstraintKeyNos SMALLINT[]; /* */ v_ConstraintName name; /*   */ v_ConstraintType name; /*     */ v_isUnique BOOLEAN; /*   */ v_isPrimary BOOLEAN;/*      Primary KEY */ v_AttributeNum INTEGER; /*   */ v_AttributeName name; /*  */ v_ConstraintKeyNames TEXT; /*     */ v_RefTableOID INTEGER; /* OID ,     */ v_RefTableName name;/*  ,     */ v_RefTableKeyNos SMALLINT[]; /* */ v_RefTableKeyNames TEXT;/*     ,    */ v_ConstraintSource TEXT; /*     CHECK*/ c_Delimiter CONSTANT VARCHAR(2):=','; --****************************************************************************************************** BEGIN FOR v_ConstraintRec IN SELECT con.oid AS ConstraintOID , tbl.OID AS TableOID, con.conname AS ConstraintName, con.contype AS ConstraintType, con.conkey AS ConstraintKeyNos, reftbl.OID AS RefTableOID, reftbl.relname AS RefTableName, con.confkey AS RefTableKeyNos, con.consrc AS ConstraintSource FROM pg_constraint con INNER JOIN pg_class tbl ON con.conrelid=tbl.oid INNER JOIN pg_namespace nsp ON tbl.relnamespace=nsp.oid LEFT OUTER JOIN pg_class reftbl ON con.confrelid=reftbl.oid WHERE LOWER(nsp.nspname)=LOWER(a_SchemaName) AND LOWER(tbl.relname)=LOWER(a_TableName) ORDER BY con.contype DESC,con.conname LOOP v_ConstraintOID:=v_ConstraintRec.ConstraintOID; v_TableOID:=v_ConstraintRec.TableOID; v_ConstraintName:=v_ConstraintRec.ConstraintName; v_ConstraintType:=v_ConstraintRec.ConstraintType; v_ConstraintKeyNos:=v_ConstraintRec.ConstraintKeyNos; v_RefTableOID:=v_ConstraintRec.RefTableOID; v_RefTableName:=v_ConstraintRec.RefTableName; v_RefTableKeyNos:=v_ConstraintRec.RefTableKeyNos; v_ConstraintSource:=v_ConstraintRec.ConstraintSource; v_ConstraintKeyNames:=''; FOREACH v_AttributeNum IN ARRAY v_ConstraintKeyNos LOOP SELECT INTO v_AttributeName attr.attname::VARCHAR(100) AS r_AttributeName FROM pg_attribute attr WHERE attr.attrelid=v_TableOID AND attr.attnum=v_AttributeNum; v_ConstraintKeyNames:=v_ConstraintKeyNames|| CASE WHEN v_ConstraintKeyNames='' THEN '' ELSE c_Delimiter END ||v_AttributeName; END LOOP; v_RefTableKeyNames:=''; IF v_RefTableKeyNos IS NOT NULL THEN FOREACH v_AttributeNum IN ARRAY v_RefTableKeyNos LOOP SELECT INTO v_AttributeName attr.attname::VARCHAR(100) AS r_AttributeName FROM pg_attribute attr WHERE attr.attrelid=v_RefTableOID AND attr.attnum=v_AttributeNum; v_RefTableKeyNames:=v_RefTableKeyNames|| CASE WHEN v_RefTableKeyNames='' THEN '' ELSE c_Delimiter END ||v_AttributeName; END LOOP; END IF; RETURN QUERY SELECT v_ConstraintName,v_ConstraintType,v_ConstraintKeyNames, v_RefTableName,v_RefTableKeyNames, v_ConstraintSource; END LOOP; RETURN; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_Constraintes(a_SchemaName NAME, a_TableName NAME) IS '    '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_Constraintes (a_SchemaName VARCHAR(256), a_TableName VARCHAR(256)); /********************************************************************************************************/ /*      */ /********************************************************************************************************/ CREATE OR REPLACE FUNCTION admtf_Table_Constraintes (a_SchemaName VARCHAR(256) default 'public', /*     */ a_TableName VARCHAR(256) default NULL /*   */ ) RETURNS TABLE (r_ConstraintName VARCHAR(256),r_ConstraintType VARCHAR(256),r_ConstraintKeyNames Text,r_RefTableName VARCHAR(256),r_RefTableKeyNames Text,r_ConstraintSource Text) AS $BODY$ DECLARE --****************************************************************************************************** BEGIN RETURN QUERY SELECT tc.r_ConstraintName::VARCHAR(256), tc.r_ConstraintType::VARCHAR(256), tc.r_ConstraintKeyNames::TEXT, tc.r_RefTableName::VARCHAR(256), tc.r_RefTableKeyNames::TEXT, tc.r_ConstraintSource::TEXT FROM admtf_Table_Constraintes(a_SchemaName::NAME,a_TableName::NAME) tc; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_Constraintes(a_SchemaName VARCHAR(256), a_TableName VARCHAR(256)) IS '    '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; SELECT * FROM admtf_Table_Constraintes('public'::VARCHAR(256),'Street'::VARCHAR(256)); SELECT * FROM admtf_Table_Constraintes('public'::name,'Street'::name); 



Adtf_Table_Indexes рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдирд╛


рдлрд╝рдВрдХреНрд╢рди рд╕реНрд░реЛрдд рдХреЛрдб рдкрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдпрд╣рд╛рдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред
рдлрд╝рдВрдХреНрд╢рди рд╕реНрд░реЛрдд рдХреЛрдб
 BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_Indexes (a_SchemaName NAME, a_TableName NAME); /********************************************************************************************************/ /*      */ /********************************************************************************************************/ CREATE OR REPLACE FUNCTION admtf_Table_Indexes (a_SchemaName NAME default 'public', /*     */ a_TableName NAME default NULL /*   */ ) RETURNS TABLE (r_IndexName NAME,r_IndexType NAME,r_isUnique BOOLEAN,r_isPrimary BOOLEAN, r_IndexKeyNames Text) AS $BODY$ DECLARE c_IndexKind CONSTANT CHAR:='i'; v_IndexRec RECORD; /*   */ v_Scale INTEGER; /*   */ v_TableOID INTEGER; /* OID */ v_IndexOID INTEGER; /* OID */ v_IndexKeyNos SMALLINT[]; /* */ v_IndexName NAME; /*   */ v_IndexAMName NAME; /*    ( ) */ v_isUnique BOOLEAN; /*   */ v_isPrimary BOOLEAN; /*      Primary KEY */ v_AttributeNum INTEGER; /*   */ v_AttributeName NAME; /*  */ v_IndexKeyNames TEXT; /*     */ c_Delimiter CONSTANT VARCHAR(2):=','; --****************************************************************************************************** BEGIN FOR v_IndexRec IN SELECT inxcls.oid AS IndexOID,tbl.oid AS TableOID, inxcls.relname AS IndexName,inxam.amname AS IndexAMName, inx.indisunique AS isUnique,inx.indisprimary isPrimary, inx.indkey::SMALLINT[] AS IndexKeyNos FROM pg_index inx INNER JOIN pg_class inxcls ON inx.indexrelid=inxcls.oid INNER JOIN pg_am inxam ON inxcls.relam=inxam.oid INNER JOIN pg_class tbl ON inx.indrelid=tbl.oid INNER JOIN pg_namespace nsp ON tbl.relnamespace=nsp.oid WHERE LOWER(nsp.nspname)=LOWER(a_SchemaName) AND inxcls.relkind=c_IndexKind AND tbl.relname=LOWER(a_TableName) ORDER BY inxam.amname, inxcls.relname LOOP v_IndexOID:=v_IndexRec.IndexOID; v_TableOID:=v_IndexRec.TableOID; v_IndexName:=v_IndexRec.IndexName; v_IndexAMName:=v_IndexRec.IndexAMName; v_isUnique:=v_IndexRec.isUnique; v_isPrimary:=v_IndexRec.isPrimary; v_IndexKeyNos:=v_IndexRec.IndexKeyNos; v_IndexKeyNames:=''; FOREACH v_AttributeNum IN ARRAY v_IndexKeyNos LOOP SELECT INTO v_AttributeName attr.attname::VARCHAR(100) AS r_AttributeName FROM pg_attribute attr WHERE attr.attrelid=v_TableOID AND attr.attnum=v_AttributeNum; v_IndexKeyNames:=v_IndexKeyNames|| CASE WHEN v_IndexKeyNames='' THEN '' ELSE c_Delimiter||' ' END || v_AttributeName; END LOOP; RETURN QUERY SELECT v_IndexName,v_IndexAMName,v_isUnique, v_isPrimary,v_IndexKeyNames; END LOOP; RETURN; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_Indexes(a_SchemaName NAME, a_TableName NAME) IS '    '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_Indexes (a_SchemaName VARCHAR(256), a_TableName VARCHAR(256)); /********************************************************************************************************/ /*      */ /********************************************************************************************************/ CREATE OR REPLACE FUNCTION admtf_Table_Indexes (a_SchemaName VARCHAR(256) default 'public', /*     */ a_TableName VARCHAR(256) default NULL /*   */ ) RETURNS TABLE (r_IndexName VARCHAR(256),r_IndexType VARCHAR(256),r_isUnique BOOLEAN,r_isPrimary BOOLEAN, r_IndexKeyNames TEXT) AS $BODY$ DECLARE --****************************************************************************************************** BEGIN RETURN QUERY SELECT ti.r_IndexName::VARCHAR(256), ti.r_IndexType::VARCHAR(256), ti.r_isUnique::BOOLEAN, ti.r_isPrimary::BOOLEAN, ti.r_IndexKeyNames::TEXT FROM admtf_Table_Indexes(a_SchemaName::NAME,a_TableName::NAME) ti; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_Indexes(a_SchemaName VARCHAR(256), a_TableName VARCHAR(256)) IS '    '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; SELECT * FROM admtf_Table_Indexes('public'::NAME,'Street'::NAME); SELECT * FROM admtf_Table_Indexes('public'::VARCHAR(256),'Street'::VARCHAR(256)); 



рдПрдХ рдХрд░реНрд╕рд░ рдХреЗ рдмрд┐рдирд╛ admtf_Table_Indexes рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдирд╛


.
 BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_Indexes (a_SchemaName NAME, a_TableName NAME); /********************************************************************************************************/ /*      */ /********************************************************************************************************/ CREATE OR REPLACE FUNCTION admtf_Table_Indexes (a_SchemaName NAME default 'public', /*     */ a_TableName NAME default NULL /*   */ ) RETURNS TABLE (r_IndexName NAME,r_IndexType NAME,r_isUnique BOOLEAN,r_isPrimary BOOLEAN, r_IndexKeyNames Text) AS $BODY$ DECLARE c_IndexKind CONSTANT CHAR:='i'; c_Delimiter CONSTANT VARCHAR(2):=', '; --****************************************************************************************************** BEGIN RETURN QUERY SELECT inxcls.relname AS r_IndexName, inxam.amname AS r_IndexType, inx.indisunique AS r_isUnique, inx.indisprimary r_isPrimary, STRING_AGG(attr.attname||CASE inxam.amcanorder WHEN true THEN CASE inx.indoption[inx.No] & 1 WHEN 1 THEN ' DESC' ELSE ' ASC' END ELSE '' END, c_Delimiter ORDER BY inx.No) FROM (SELECT i.indrelid, i.indexrelid,i.indisunique, i.indisprimary,i.indkey::SMALLINT[], i.indoption::SMALLINT[], generate_subscripts(i.indkey, 1) as No FROM pg_index i) inx INNER JOIN pg_class inxcls ON inx.indexrelid=inxcls.oid INNER JOIN pg_am inxam ON inxcls.relam=inxam.oid INNER JOIN pg_class tbl ON inx.indrelid=tbl.oid INNER JOIN pg_namespace nsp ON tbl.relnamespace=nsp.oid INNER JOIN pg_attribute attr ON attr.attrelid=tbl.OID AND attr.attnum=inx.indkey[inx.No] WHERE LOWER(nsp.nspname)=LOWER(a_SchemaName) AND inxcls.relkind=c_IndexKind AND tbl.relname=LOWER(a_TableName) GROUP BY inxcls.relname,inxam.amname,inx.indisunique,inx.indisprimary ORDER BY inxcls.relname; RETURN; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_Indexes(a_SchemaName NAME, a_TableName NAME) IS '    '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; BEGIN TRANSACTION; DROP FUNCTION IF EXISTS admtf_Table_Indexes (a_SchemaName VARCHAR(256), a_TableName VARCHAR(256)); /********************************************************************************************************/ /*      */ /********************************************************************************************************/ CREATE OR REPLACE FUNCTION admtf_Table_Indexes (a_SchemaName VARCHAR(256) default 'public', /*    */ a_TableName VARCHAR(256) default NULL /*   */ ) RETURNS TABLE (r_IndexName VARCHAR(256),r_IndexType VARCHAR(256),r_isUnique BOOLEAN,r_isPrimary BOOLEAN, r_IndexKeyNames TEXT) AS $BODY$ DECLARE --****************************************************************************************************** BEGIN RETURN QUERY SELECT ti.r_IndexName::VARCHAR(256), ti.r_IndexType::VARCHAR(256), ti.r_isUnique::BOOLEAN, ti.r_isPrimary::BOOLEAN, ti.r_IndexKeyNames::TEXT FROM admtf_Table_Indexes(a_SchemaName::NAME,a_TableName::NAME) ti; END $BODY$ LANGUAGE plpgsql; COMMENT ON FUNCTION admtf_Table_Indexes(a_SchemaName VARCHAR(256), a_TableName VARCHAR(256)) IS '    '; --ROLLBACK TRANSACTION; COMMIT TRANSACTION; SELECT * FROM admtf_Table_Indexes('public'::NAME,'Street'::NAME); SELECT * FROM admtf_Table_Indexes('public'::VARCHAR(256),'Street'::VARCHAR(256)); 



PostgreSQL. ;
PostgreSQL. .
PostgreSQL. ( ) .

Source: https://habr.com/ru/post/hi415897/


All Articles