web-dev-qa-db-fra.com

Comment déplacer toutes les tables d'un schéma des postgres à un autre

Je veux déplacer toutes les tables du schéma xyz au schéma par défaut public.

Je peux déplacer des tables individuelles avec

ALTER TABLE table_name
    SET SCHEMA public;

Et je peux obtenir toutes les tables avec

SELECT table_name FROM information_schema.tables WHERE table_schema='xyz'

Y a-t-il un moyen de combiner ces deux ensemble?

3
Tachyons

Utilisez pl/pgsql dans un DO Déclaration:

DO
$$DECLARE
   p_table regclass;
BEGIN
   SET LOCAL search_path='xyz';
   FOR p_table IN
      SELECT oid FROM pg_class
      WHERE relnamespace = 'xyz'::regnamespace
        AND relkind = 'r'
   LOOP
      EXECUTE format('ALTER TABLE %s SET SCHEMA public', p_table);
   END LOOP;
END;$$;
1
Laurenz Albe

Une version améliorée de Laurenz réponse;

DO LANGUAGE plpgsql
$body$
DECLARE
   l_old_schema NAME = 'old_schema';
   l_new_schema NAME = 'new_schema';
   l_sql TEXT;
BEGIN
  FOR l_sql IN
    SELECT 
        format('ALTER TABLE %I.%I SET SCHEMA %I', n.nspname, c.relname, l_new_schema)
      FROM pg_class c
      JOIN pg_namespace n ON n.oid = c.relnamespace
      WHERE
        n.nspname = l_old_schema AND
        c.relkind = 'r'
  LOOP
    RAISE NOTICE 'appliying %', l_sql;
    EXECUTE l_sql;
  END LOOP;
END;
$body$;
1
Sahap Asci

Version légèrement modifiée de Laurenz

DO 
$$ DECLARE
   table_record regclass;
BEGIN
  SET LOCAL search_path = xyz;
  FOR table_record IN
   SELECT  table_name  FROM information_schema.tables WHERE table_schema='xyz'
  LOOP
    EXECUTE format('ALTER TABLE %s SET SCHEMA public',table_record);
  END LOOP;
END; $$
0
Tachyons