4

publicinformation_schemaおよびそれらを除く、データベース内のすべてのスキーマを削除する必要がありますLIKE 'pg_%'

これが私が見つけたものです:(このバリアントは機能していないようです)

   CREATE OR REPLACE FUNCTION drop_all () 
   RETURNS VOID  AS
   $$
   DECLARE rec RECORD; 
   BEGIN
       -- Get all the schemas
        FOR rec IN
        SELECT DISTINCT schemaname
         FROM pg_catalog.pg_tables
         -- You can exclude the schema which you don't want to drop by adding another condition here
         WHERE schemaname NOT LIKE 'pg_%' AND schemaname != 'public' 
         AND schemaname != 'information_schema'
           LOOP
             EXECUTE 'DROP SCHEMA ' || rec.schemaname || ' CASCADE'; 
           END LOOP; 
           RETURN; 
   END;
   $$ LANGUAGE plpgsql;

   SELECT drop_all();

別のバリアント: (これはおそらく機能しますが、それでもアプリがクラッシュします)

SELECT string_agg(format('DROP SCHEMA %I CASCADE;', nspname), E'\n')
FROM   pg_namespace WHERE nspname != 'public'
AND nspname NOT LIKE 'pg_%'
AND nspname != 'information_schema';

そのため、クエリが正しいことを確認するか、できればクエリの別のバリエーションを見つけたいと思いました。

それを行うための別のクエリを見つけるのを手伝ってくれる人はいますか?

4

1 に答える 1

7

クエリを使用しているため、テーブルを含むスキーマのみを削除します。

 SELECT DISTINCT schemaname
         FROM pg_catalog.pg_tables

そのため、テーブルのないスキーマは削除されません。

別のクエリを使用する必要があります

SELECT n.nspname AS "Name",
  pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner"
FROM pg_catalog.pg_namespace n
WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'
于 2015-07-25T17:42:37.810 に答える