すべてのテーブルをスキーマxyz
からデフォルトのスキーマpublic
に移動します。
で個々のテーブルを移動できます
ALTER TABLE table_name
SET SCHEMA public;
そして、私はすべてのテーブルを得ることができます
SELECT table_name FROM information_schema.tables WHERE table_schema='xyz'
これら2つを組み合わせる方法はありますか?
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;$$;
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$;
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; $$