web-dev-qa-db-ja.com

すべてのテーブルを1つのPostgresスキーマから別のスキーマに移動する方法

すべてのテーブルをスキーマxyzからデフォルトのスキーマpublicに移動します。

で個々のテーブルを移動できます

ALTER TABLE table_name
    SET SCHEMA public;

そして、私はすべてのテーブルを得ることができます

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

これら2つを組み合わせる方法はありますか?

1
Tachyons

DOステートメントでPL/pgSQLを使用します。

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

Laurenz の回答の改良版。

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

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