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?
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;$$;
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$;
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; $$