Lưu ý: câu trả lời của tôi là về việc thực sự xóa các bảng và các đối tượng cơ sở dữ liệu khác; để xóa tất cả dữ liệu trong các bảng, tức là cắt bớt tất cả các bảng , Endre Cả hai đã cung cấp một câu lệnh (thực thi trực tiếp) được thực hiện tốt tương tự một tháng sau đó.
Đối với các trường hợp bạn không thể DROP SCHEMA public CASCADE;
, DROP OWNED BY current_user;
hoặc một cái gì đó, đây là tập lệnh SQL độc lập mà tôi đã viết, nó an toàn cho giao dịch (nghĩa là bạn có thể đặt nó ở giữa BEGIN;
và ROLLBACK;
để kiểm tra hoặc COMMIT;
thực hiện hành động đó) và thực sự làm việc đó) và Dọn dẹp tất cả các đối tượng cơ sở dữ liệu của thành phố tốt, tất cả những thứ được sử dụng trong cơ sở dữ liệu mà ứng dụng của chúng tôi sử dụng hoặc tôi có thể thêm vào một cách hợp lý, đó là:
- kích hoạt trên bàn
- các ràng buộc trên các bảng (FK, PK
CHECK
,, UNIQUE
)
- chỉ dẫn
VIEW
s (bình thường hoặc vật chất hóa)
- những cái bàn
- trình tự
- thói quen (tổng hợp chức năng, chức năng, thủ tục)
- tất cả các schemata mặc định (tức là không
public
hoặc DB-Internal), chúng tôi sở hữu: kịch bản này rất hữu ích khi được chạy dưới dạng không phải là một siêu người dùng cơ sở dữ liệu. một siêu người dùng có thể loại bỏ tất cả các schemata (mặc dù những cái thực sự quan trọng vẫn bị loại trừ rõ ràng)
- tiện ích mở rộng (do người dùng đóng góp nhưng tôi thường cố tình để chúng trong)
Không bị rơi là (một số cố ý; một số chỉ vì tôi không có ví dụ trong DB của chúng tôi):
- các
public
giản đồ (ví dụ như cho các công cụ mở rộng-cung cấp trong họ)
- collations và các công cụ địa phương khác
- kích hoạt sự kiện
- văn bản tìm kiếm công cụ, ... (xem ở đây cho các công cụ khác mà tôi có thể đã bỏ lỡ)
- vai trò hoặc cài đặt bảo mật khác
- loại hỗn hợp
- bàn nướng bánh mì
- Bảng FDW và nước ngoài
Điều này thực sự hữu ích cho các trường hợp khi kết xuất mà bạn muốn khôi phục thuộc phiên bản lược đồ cơ sở dữ liệu khác (ví dụ với Debian dbconfig-common
, Flyway hoặc Liquibase / DB-Manul) so với cơ sở dữ liệu bạn muốn khôi phục.
Tôi cũng đã có một phiên bản xóa tất cả mọi thứ ngoại trừ hai bảng và những gì thuộc về họ (một chuỗi, được kiểm tra thủ công, xin lỗi, tôi biết, nhàm chán) trong trường hợp ai đó quan tâm; khác biệt là nhỏ. Liên hệ với tôi hoặc kiểm tra repo này nếu quan tâm.
SQL
-- Copyright © 2019, 2020
-- mirabilos <t.glaser@tarent.de>
--
-- Provided that these terms and disclaimer and all copyright notices
-- are retained or reproduced in an accompanying document, permission
-- is granted to deal in this work without restriction, including un‐
-- limited rights to use, publicly perform, distribute, sell, modify,
-- merge, give away, or sublicence.
--
-- This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
-- the utmost extent permitted by applicable law, neither express nor
-- implied; without malicious intent or gross negligence. In no event
-- may a licensor, author or contributor be held liable for indirect,
-- direct, other damage, loss, or other issues arising in any way out
-- of dealing in the work, even if advised of the possibility of such
-- damage or existence of a defect, except proven that it results out
-- of said person’s immediate fault when using the work as intended.
-- -
-- Drop everything from the PostgreSQL database.
DO $$
DECLARE
q TEXT;
r RECORD;
BEGIN
-- triggers
FOR r IN (SELECT pns.nspname, pc.relname, pt.tgname
FROM pg_catalog.pg_trigger pt, pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
WHERE pns.oid=pc.relnamespace AND pc.oid=pt.tgrelid
AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
AND pt.tgisinternal=false
) LOOP
EXECUTE format('DROP TRIGGER %I ON %I.%I;',
r.tgname, r.nspname, r.relname);
END LOOP;
-- constraints #1: foreign key
FOR r IN (SELECT pns.nspname, pc.relname, pcon.conname
FROM pg_catalog.pg_constraint pcon, pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
WHERE pns.oid=pc.relnamespace AND pc.oid=pcon.conrelid
AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
AND pcon.contype='f'
) LOOP
EXECUTE format('ALTER TABLE ONLY %I.%I DROP CONSTRAINT %I;',
r.nspname, r.relname, r.conname);
END LOOP;
-- constraints #2: the rest
FOR r IN (SELECT pns.nspname, pc.relname, pcon.conname
FROM pg_catalog.pg_constraint pcon, pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
WHERE pns.oid=pc.relnamespace AND pc.oid=pcon.conrelid
AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
AND pcon.contype<>'f'
) LOOP
EXECUTE format('ALTER TABLE ONLY %I.%I DROP CONSTRAINT %I;',
r.nspname, r.relname, r.conname);
END LOOP;
-- indicēs
FOR r IN (SELECT pns.nspname, pc.relname
FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
WHERE pns.oid=pc.relnamespace
AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
AND pc.relkind='i'
) LOOP
EXECUTE format('DROP INDEX %I.%I;',
r.nspname, r.relname);
END LOOP;
-- normal and materialised views
FOR r IN (SELECT pns.nspname, pc.relname
FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
WHERE pns.oid=pc.relnamespace
AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
AND pc.relkind IN ('v', 'm')
) LOOP
EXECUTE format('DROP VIEW %I.%I;',
r.nspname, r.relname);
END LOOP;
-- tables
FOR r IN (SELECT pns.nspname, pc.relname
FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
WHERE pns.oid=pc.relnamespace
AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
AND pc.relkind='r'
) LOOP
EXECUTE format('DROP TABLE %I.%I;',
r.nspname, r.relname);
END LOOP;
-- sequences
FOR r IN (SELECT pns.nspname, pc.relname
FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
WHERE pns.oid=pc.relnamespace
AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
AND pc.relkind='S'
) LOOP
EXECUTE format('DROP SEQUENCE %I.%I;',
r.nspname, r.relname);
END LOOP;
-- extensions (only if necessary; keep them normally)
FOR r IN (SELECT pns.nspname, pe.extname
FROM pg_catalog.pg_extension pe, pg_catalog.pg_namespace pns
WHERE pns.oid=pe.extnamespace
AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
) LOOP
EXECUTE format('DROP EXTENSION %I;', r.extname);
END LOOP;
-- aggregate functions first (because they depend on other functions)
FOR r IN (SELECT pns.nspname, pp.proname, pp.oid
FROM pg_catalog.pg_proc pp, pg_catalog.pg_namespace pns, pg_catalog.pg_aggregate pagg
WHERE pns.oid=pp.pronamespace
AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
AND pagg.aggfnoid=pp.oid
) LOOP
EXECUTE format('DROP AGGREGATE %I.%I(%s);',
r.nspname, r.proname,
pg_get_function_identity_arguments(r.oid));
END LOOP;
-- routines (functions, aggregate functions, procedures, window functions)
IF EXISTS (SELECT * FROM pg_catalog.pg_attribute
WHERE attrelid='pg_catalog.pg_proc'::regclass
AND attname='prokind' -- PostgreSQL 11+
) THEN
q := 'CASE pp.prokind
WHEN ''p'' THEN ''PROCEDURE''
WHEN ''a'' THEN ''AGGREGATE''
ELSE ''FUNCTION''
END';
ELSIF EXISTS (SELECT * FROM pg_catalog.pg_attribute
WHERE attrelid='pg_catalog.pg_proc'::regclass
AND attname='proisagg' -- PostgreSQL ≤10
) THEN
q := 'CASE pp.proisagg
WHEN true THEN ''AGGREGATE''
ELSE ''FUNCTION''
END';
ELSE
q := '''FUNCTION''';
END IF;
FOR r IN EXECUTE 'SELECT pns.nspname, pp.proname, pp.oid, ' || q || ' AS pt
FROM pg_catalog.pg_proc pp, pg_catalog.pg_namespace pns
WHERE pns.oid=pp.pronamespace
AND pns.nspname NOT IN (''information_schema'', ''pg_catalog'', ''pg_toast'')
' LOOP
EXECUTE format('DROP %s %I.%I(%s);', r.pt,
r.nspname, r.proname,
pg_get_function_identity_arguments(r.oid));
END LOOP;
-- nōn-default schemata we own; assume to be run by a not-superuser
FOR r IN (SELECT pns.nspname
FROM pg_catalog.pg_namespace pns, pg_catalog.pg_roles pr
WHERE pr.oid=pns.nspowner
AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast', 'public')
AND pr.rolname=current_user
) LOOP
EXECUTE format('DROP SCHEMA %I;', r.nspname);
END LOOP;
-- voilà
RAISE NOTICE 'Database cleared!';
END; $$;
Đã thử nghiệm, ngoại trừ các bổ sung sau này (được extensions
đóng góp bởi Clément Prévost ), trên PostgreQuery 9.6 ( jessie-backports
). Loại bỏ tổng hợp được thử nghiệm vào ngày 9.6 và 12.2, loại bỏ quy trình cũng được thử nghiệm vào ngày 12.2. Sửa lỗi và cải tiến hơn nữa chào mừng!
dbname='db_name' && dropdb $dbname && createdb $dbname && psql -d $dbname -f dump.sql