Ho bisogno di creare script per oggetti di database PostgreSQL.Ottieni la definizione di funzione, sequenza, tipo ecc. In Postgresql con query SQL
Non ho accesso a pg_dump. Quindi devo ottenere tutto con query SQL. Come potrei farlo?
Ho bisogno di creare script per oggetti di database PostgreSQL.Ottieni la definizione di funzione, sequenza, tipo ecc. In Postgresql con query SQL
Non ho accesso a pg_dump. Quindi devo ottenere tutto con query SQL. Come potrei farlo?
per ottenere la definizione di una funzione utilizzare pg_get_functiondef()
:
select pg_get_functiondef(oid)
from pg_proc
where proname = 'foo';
ci sono funzioni simili per recuperare la definizione di un indice, una visione, una regola e così via. Per i dettagli consultare il manuale: http://www.postgresql.org/docs/current/static/functions-info.html
Ottenere la definizione di un tipo di utente è un po 'più complicato. Sarà necessario eseguire una query information_schema.attributes
per questo:
select attribute_name, data_type
from information_schema.attributes
where udt_schema = 'public'
and udt_name = 'footype'
order by ordinal_postion;
Da che è necessario riassemblare la dichiarazione create type
.
Per maggiori dettagli sarà necessario leggere la documentazione del catalogo di sistema: http://www.postgresql.org/docs/current/static/catalogs.html
Ma si dovrebbe preferire information_schema
vista in caso di ritorno le stesse informazioni.
Grazie per la risposta. Ho circa 8 tipi di utenti nel mio database ma quando guardo in information_schema.attributes ci sono 0 righe. Qualche idea? – John
@ John: nessuna idea. Puoi pubblicare la definizione di questi tipi? Per ottenere maggiori dettagli, le istruzioni seguono il consiglio di Erwin e l'avvio di psql usando l'opzione -E per vedere quali statimtenti sta usando. Molto probabilmente qualcosa che coinvolge pg_type e pg_attribute. –
Troverete psql -E
strumentale nella vostra ricerca per quelle domande.
Visualizza le query psql
utilizzate durante l'esecuzione dei comandi backslash, ad esempio \df+ myfunc
, per i dettagli su questa funzione.
Ecco una query completa campione utilizzando pg_get_functiondef:
WITH funcs AS (
SELECT
n.nspname AS schema
,proname AS sproc_name
,proargnames AS arg_names
,t.typname AS return_type
,d.description
,pg_get_functiondef(p.oid) as definition
FROM pg_proc p
JOIN pg_type t on p.prorettype = t.oid
JOIN pg_description d on p.oid = d.objoid
JOIN pg_namespace n on n.oid = p.pronamespace
WHERE n.nspname = 'some_schema_name_here'
)
SELECT *
FROM funcs
;;
nota, si dovrebbe, ovviamente, specificare il nome dello schema, (o "pubblico" se si utilizza tale schema)
Nota, preferisco questo formato perché posso utilizzare questa query per cercare funzioni contenenti testo specifico nella descrizione (la documentazione della mia funzione di base) o nella definizione della funzione. –
Per una singola funzione vedere '\ ef' che" modifica la funzione [a] sotto forma di comando CREATE FUNCTION "(http://www.postgresql.org/docs/9.3/static/app-psql.html) –