2009-05-11 6 views
0

적당한 PostgreSQL 설치로 우리는 꽤 많은 저장 프로 시저/함수 및 유형을 축적했습니다. 따라서 처리 (즉 SMALLINT 대신 BIGINT의) 형태의 하나 개의 원소 잘못된 유형의 가장 낮은 레벨의 복합 타입 지금 PostgreSQL SProcs를 리팩토링

(즉 3 종류가 함께 내장되어 수많은 기능은 이러한 유형의 참조) 그것은 동일하며 범위 만 다릅니다.

  1. 어떻게 모든 종류의 에 유형 (pg_catalog.pg_type이 부족 것) 따라 알 수 있습니까?
  2. 형식에 따라 기능을 모두 알 수 있습니까 ( 인수 및 로컬 범위 스코어링)?
  3. 나는 그것에 따라 모든 하나의 함수를 다시 작성/삭제없이 복합 형 (아마도 BIGINT하는 SMALLINT 변경) 를 refactore 수 있습니까?
  4. 해당 리팩토링에 대한 자동화/공구/모범 사례 종류가 있습니까?

나는 4 가지 질문을 알고 있지만 atm은 실망스럽고 도움이 될만한 답변입니다. 많은 감사!

답변

1

시스템 카탈로그 "pg_depend"에는 유용한 종속성 정보가 포함되어 있습니다. 당신은 조금 같은 특정 종류에 따라 객체를 찾을 수 있습니다 : 이것은 "information_schema.sql_identifier"유형에 따라 개체를 발견

select * from pg_depend where refclassid = 'pg_type'::regclass 
    and refobjid = 'information_schema.sql_identifier'::regtype; 

. 결과적으로 classid는 카탈로그의 OID입니다. 예를 들어 사용자 유형에 따라 열의 경우 classid는 'pg_class'입니다. :: regclass, objid는 pg_class 행의 OID이고 objsubid는 pg_attribute의 attnum 값입니다. 이 경우에이 같은 결과를 포맷 할 수 있도록 :

select objid::regclass, attname from pg_depend 
    join pg_attribute on pg_attribute.attrelid = pg_depend.objid and pg_attribute.attnum = pg_depend.objsubid 
where refclassid = 'pg_type'::regclass and refobjid = 'information_schema.sql_identifier'::regtype 
    and classid = 'pg_class'::regclass 
limit 10 

그래서 pg_depend에, (classid,objid,objsubid)(refclassid,refobjid) 설명 개체에 따라 약간의 개체를 설명합니다.

+0

이것은 훌륭하지만, 형식 계층 구조 자체 만 제공합니다. 맞습니까? 종속 기능으로 확장되지 않습니까? – Martin

+0

어떤 함수가 어떤 사용자 유형 (refclassid = 'pg_proc':: regclass)에 의존하는지 알려줄 것이지만 어떤 함수가 다른 함수를 호출하는지 알려주지 않을 것입니다. 사용자 함수를 로컬 변수로 사용하는지 확인하기 위해 함수 구현으로 넘어 가지 않을 것이라고 생각합니다. 나는이 정보가 모두 PostgreSQL의 언어 불가 지론적인 부분에 의해 관리되고 있다고 생각합니다. – araqnid

+0

plpsql 코드 기반을 리펙토링하는 문제가 발생해야하므로 더 많은 정보를 얻을 수 있는지 알아봐야합니다. 거기에 몇 가지 솔루션이나 도구가 있어야합니다. – Martin