2011-06-16 3 views
0

J'ai une grosse base de données (dans PostgreSQL 8.4) que j'essaie d'analyser en plus petites parties. Pour ce faire, je copie des parties du contenu de la grosse base de données vers d'autres schémas (je sais que c'est en quelque sorte contre la philosophie des bases de données de copier des données, mais sans cette étape l'analyse est trop lente).automatiser la création de schéma dans PostgreSQL (peut-être plpgsql?)

Il y a un certain nombre de commandes SQL que j'ai besoin d'exécuter, pour obtenir un nouveau schéma avec toutes les tables nécessaires à l'intérieur. Cependant, la différence entre la création d'un schéma et la création d'un autre schéma est très faible (en principe, c'est juste le nom du schéma et une valeur différente dans une clause "WHERE").

Ma question est la suivante:

Est-il possible d'écrire une fonction qui prend une certaine valeur en tant que paramètre et utilise ce paramètre dans la clause where (et comme le nom du schéma?) Si elle est possible, quelle langue de programme suggéreriez-vous (peut-être plpgsql), et à quoi ressemblerait un tel script (juste comme un squelette)?

Merci d'avance!

Répondre

2

Je ne sais pas, je fais son sens de votre question, mais il semble que devraient utiliser le schéma temporaire:

create temporary table foo as select * from bar where ... 

À l'occasion, il est également utile d'utiliser le même nom:

create temporary table foo as select * from foo where ... 

Sinon oui, fonctionne SQL dynamique:

create function do_stuff(_table regclass) returns void as $$ 
begin 
    execute 'select 1 from ' || _table; 
end; $$ language plpgsql strict; 
select do_stuff('schemaname.tablename'); 

http://www.postgresql.org/docs/9.0/interactive/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN

+0

merci! la dynamique sql-partie de votre réponse semble être ce que je cherche! Cela fonctionnerait-il également avec '... BEGIN EXECUTE 'CREATE SCHEMA' || schemaname; ... 'ou' ... BEGIN EXECUTE 'CREATE TABLE' || nom de la table; ... '? – speendo

+1

Oui, avec un tweak. Changez la définition en do_stuff (texte), et assurez-vous d'utiliser quote_ident() le cas échéant. –

Questions connexes