我需要删除数据库中的所有模式,public
,information_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';
所以,我想确保查询是正确的,或者希望找到另一个查询变体。
有人可以帮我找到另一个查询吗?
答案 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'