Il Refactoring Di PostgreSQL SProcs
-
21-08-2019 - |
Domanda
con un moderato installazione di PostgreSQL abbiamo accumulato un bel paio di stored procedure, funzioni e tipi.
Ora il livello più basso di tipo composito (cioè3 tipi sono costruiti con esso e una miriade di funzioni, fare riferimento a tutti i tipi) un elemento di un tipo di tipo sbagliato (cioèsmallint invece di bigint), quindi la gestione è identica, solo la gamma è diverso.
- Come faccio a sapere tutti i tipi a seconda un tipo (pg_catalog.pg_type sembra insufficiente)?
- Come posso sapere tutto funzioni a seconda del tipo (come argomenti e con ambito locale var)?
- Posso refactore un tipo composito (forse cambiare smallint per bigint) senza cadere/ricostruzione di ogni singola funzione a seconda su di esso?
- C'è qualche tipo di automazione/strumento/best practice per ad un refactoring?
So che è 4 domande in una, ma atm questo è un po ' frustrante e qualsiasi aiuto sarebbe apprezzato!Molte Grazie!
Soluzione
Il sistema di catalogo "pg_depend" contiene alcune utili informazioni di dipendenza.Si possono trovare oggetti a seconda di particolari tipi un po ' come questo:
select * from pg_depend where refclassid = 'pg_type'::regclass
and refobjid = 'information_schema.sql_identifier'::regtype;
Trova gli oggetti dipendono dalla "information_schema.sql_identifier" tipo.Il risultato, classid è l'OID di un catalogo, per esempio, per una colonna a seconda della tipologia di utente, classid è 'pg_class'::regclass, objid è l'OID del pg_class riga, e objsubid è il attnum valore da pg_attribute, quindi per questo caso è possibile formattare i risultati come questo:
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
Così in pg_depend, (classid,objid,objsubid)
descrivere un oggetto che dipende dall'oggetto descritto da (refclassid,refobjid)
.