如何使用SQL查询删除PostgreSQL中的所有模式?

时间:2015-07-25 13:59:11

标签: postgresql ruby-on-rails-4 postgresql-9.3 apartment-gem

我需要删除数据库中的所有模式,publicinformation_schemaLIKE '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';

所以,我想确保查询是正确的,或者希望找到另一个查询变体。

有人可以帮我找到另一个查询吗?

1 个答案:

答案 0 :(得分:4)

它只删除任何表的架构,因为您使用的是查询:

 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'