मैं PostgreSQL डेटाबेस में सभी तालिकाओं को कैसे छोड़ सकता हूं?


1040

मैं कमांड लाइन से काम करते हुए PostgreSQL के सभी टेबल कैसे गिरा सकता हूं?

मैं केवल डेटाबेस, केवल सभी तालिकाओं और उन सभी डेटा को छोड़ना नहीं चाहता।


3
आप किस कमांड लाइन की बात कर रहे हैं? हम सभी जानते हैं कि आप Windows PowerShell कार्यान्वयन की तलाश कर रहे हैं।
ग्रेग स्मिथ

4
माफ़ करना। यूनिक्स पर काम करना, कमांड लाइन पर 'psql' टाइप करने के बाद - तो psql कमांड-लाइन वातावरण ही।
AP257

101
DROP SCHEMA सार्वजनिक मामले; - कंपकंपी
Wildplasser

20
@ 0 यदि आपको 'क्रिएट स्कीमा पब्लिक' करनी पड़ेगी; नई टेबल्स को जोड़ने के लिए (कठिन तरीका पता चला)
nym

4
BTW, जब आप ड्रॉप करते हैं, तो आप publicकिसी भी स्थापित एक्सटेंशन को खो देते हैं।
सूदो

जवाबों:


1374

यदि आपकी सभी तालिकाएँ एक एकल स्कीमा में हैं, तो यह दृष्टिकोण काम कर सकता है (नीचे कोड मानता है कि आपके स्कीमा का नाम है public)

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;

यदि आप PostgreSQL 9.3 या अधिक का उपयोग कर रहे हैं, तो आपको डिफ़ॉल्ट अनुदान को पुनर्स्थापित करने की भी आवश्यकता हो सकती है।

GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;

105
ध्यान दें कि यह सार्वजनिक स्कीमा में परिभाषित सभी कार्यों, विचारों आदि को भी हटा देगा।
ब्रैड कोच

5
ध्यान दें कि यह सिस्टम तालिकाओं को नहीं हटाएगा (जैसे कि वे जो शुरू होते हैं pg_) क्योंकि वे एक अलग स्कीमा में हैं pg_catalog,।
कॉंगसबोंगस

36
यह स्कीमा w / OWNER सेट को उस उपयोगकर्ता के लिए बनाएगा जिसे आपने psql में लॉग इन किया है। यह एक अलग उपयोगकर्ता के रूप में लॉग इन करने वाले w / अनुप्रयोगों को संघर्ष करेगा। उस स्थिति में, आपको पोस्ट करने के लिए "ALTER SCHEMA सार्वजनिक OWNER" चलाना होगा; (या जो भी उपयोगकर्ता आपके ऐप का उपयोग टेबल बनाने के लिए करता है)
mgojohn

13
इसे एक और उत्तर से लाना जो आप शायद बनाना चाहते GRANT ALL ON SCHEMA public TO public;हैं।
फेडेरिको

1
@Federico GRANT ALLबनाने के बाद आप क्यों चाहेंगे ?
425nesp

408

आप इस तरह से SQL स्क्रिप्ट बनाने के लिए एक क्वेरी लिख सकते हैं:

select 'drop table "' || tablename || '" cascade;' from pg_tables;

या:

select 'drop table if exists "' || tablename || '" cascade;' from pg_tables;

यदि पिछले वाक्य में कैस्केड विकल्प के कारण कुछ तालिकाएँ स्वतः ही गिर जाती हैं।

इसके अतिरिक्त, जैसा कि टिप्पणियों में कहा गया है, आप स्कीमा नाम से उन तालिकाओं को फ़िल्टर करना चाहते हैं जिन्हें आप छोड़ना चाहते हैं:

select 'drop table if exists "' || tablename || '" cascade;' 
  from pg_tables
 where schemaname = 'public'; -- or any other schema

और फिर इसे चलाएं।

शानदार COPY + PASTE भी काम करेगा।


15
मुझे लगता है कि आपका मतलब है: आप इस तरह से एक क्वेरी लिख सकते हैं ... ... और फिर क्वेरी का आउटपुट चलाएं
Vinko Vrsalovic

5
"ड्रॉप टेबल मौजूद है तो चुनें" "|| टैबलेनम ||" "कैस्केड?" pg_tables से; यह सुनिश्चित करेगा कि अपरकेस के साथ तालिकाओं को भी ठीक से गिरा दिया गया है।
इवो ​​वैन डेर विज्क

12
खण्ड "जहाँ योजनाबद्ध = 'सार्वजनिक'" जिसे लेनव ने अपने उत्तर में जोड़ा है, केवल आपके द्वारा प्रबंधित डेटाबेस को हटाने के दायरे को कम करने के लिए बहुत उपयोगी हो सकता है और सिस्टम के लोगों के लिए नहीं
Guillaume Gendre

8
@jwg: भी, क्योंकि कभी-कभी आपके पास अनुमति नहीं होती है drop schema public cascade;, लेकिन आपके पास तालिकाओं को छोड़ने की अनुमति हमेशा होती है।
Berkes

2
सार्वजनिक स्कीमा के लिए संस्करण: "ड्रॉप टेबल मौजूद है अगर" "|| स्कीमन नाम" का चयन करें। "" || टैबलेनम || "" कैस्केड? " pg_tables से जहां schemaname = 'user_data';
लुडविग

291

इस लेखन (जनवरी 2014) के रूप में सबसे स्वीकृत उत्तर है:

drop schema public cascade;
create schema public;

यह काम करता है, हालांकि यदि आपका इरादा सार्वजनिक स्कीमा को अपनी कुंवारी स्थिति में बहाल करना है तो यह कार्य को पूरी तरह से पूरा नहीं करता है। PostgreSQL 9.3.1 के लिए pgAdmin III के तहत, यदि आप "सार्वजनिक" स्कीमा पर इस तरह से क्लिक करते हैं और "SQL फलक" में देखें, तो आपको निम्नलिखित दिखाई देंगे:

-- Schema: public

-- DROP SCHEMA public;

CREATE SCHEMA public
  AUTHORIZATION postgres;

हालाँकि, इसके विपरीत एक नया डेटाबेस निम्नलिखित होगा:

-- Schema: public

-- DROP SCHEMA public;

CREATE SCHEMA public
  AUTHORIZATION postgres;

GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
COMMENT ON SCHEMA public
  IS 'standard public schema';

मेरे लिए एक अजगर वेब फ्रेमवर्क का उपयोग करना जो डेटाबेस टेबल (web2py) बनाता है, पूर्व की समस्याओं का उपयोग करके:

<class 'psycopg2.ProgrammingError'> no schema has been selected to create in 

तो मेरे दिमाग में पूरी तरह से सही उत्तर है:

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
COMMENT ON SCHEMA public IS 'standard public schema';

इन आदेशों को pgAdmin III में जारी करने पर भी ध्यान दें, मैंने क्वेरी टूल (आवर्धक ग्लास आइकन "एक्सक्यूट एब्सट्रैक्ट SQL क्वेश्चन" का उपयोग किया है) या आप प्लगइन्स का उपयोग कर सकते हैं-> PSQL कंसोल

ध्यान दें

यदि आपके पास कोई एक्सटेंशन स्थापित है, तो स्कीमा छोड़ने पर उन्हें हटा दिया जाएगा, इसलिए आपको इस बात पर ध्यान देना चाहिए कि आपको क्या स्थापित करना है और फिर आवश्यकतानुसार स्टेटमेंट निष्पादित करें। उदाहरण के लिए

CREATE EXTENSION postgis;


7
की पुष्टि। दो लाइन समाधान ( dropतब create) PostgreSQL 9.1 पर काम करते थे। 9.3 में अपग्रेड करने के बाद, दो अतिरिक्त grantआवश्यक है।
जिंगो शि

4
एक और पुष्टि: Django का उपयोग करते हुए, मुझे वही त्रुटि मिली; मुझे डेटाबेस के साथ सहभागिता करने से पहले उन अनुदानों को चलाने की आवश्यकता थी।
rjh

2
यह पूरी तरह से काम करता है, सिवाय इसके कि मुझे कुछ एक्सटेंशनों को फिर से स्थापित करने की आवश्यकता है: सृजन विस्तार यदि नहीं है तो स्टोरस्टोर; सृजन विस्तार अगर नहीं है तो pgcrypto;
शाकर

173

आप सभी तालिकाओं को छोड़ सकते हैं

DO $$ DECLARE
    r RECORD;
BEGIN
    -- if the schema you operate on is not "current", you will want to
    -- replace current_schema() in query with 'schematodeletetablesfrom'
    -- *and* update the generate 'DROP...' accordingly.
    FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP
        EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
    END LOOP;
END $$;

IMO यह बेहतर है drop schema public, क्योंकि आपको schemaसभी अनुदानों को फिर से बनाने और पुनर्स्थापित करने की आवश्यकता नहीं है ।

अतिरिक्त बोनस कि इसके लिए बाहरी स्क्रिप्टिंग भाषा की आवश्यकता नहीं है, और न ही उत्पन्न SQL के दुभाषिया की प्रतिलिपि-चिपकाना दुभाषिया के लिए।


4
इसे पोस्ट करने के लिए धन्यवाद! मैं drop schemaतरकीब का उपयोग नहीं कर सकता क्योंकि उपयोगकर्ता स्कीमा का मालिक नहीं था, केवल तालिकाओं का। यह एक हालांकि काम किया :)
vdboor

बहुत साफ और विशिष्ट ... महान समाधान, और इसे भी स्वीकार किया जाना चाहिए - आप यहां तक ​​कि जहाँ आप रखना चाहते हैं तालिकाओं को सीमित करने के लिए खंड में जोड़ सकते हैं, जैसे कि PostGIS जैसे एक्सटेंशन द्वारा आवश्यक ...
DPSSpatial

मैं इसके EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE'; साथ उस लाइन को बदलने का सुझाव EXECUTE format('DROP TABLE IF EXISTS %I CASCADE', quote_ident(r.tablename));
दूंगा

@ायर क्यों? यह मेरे लिए एक अनावश्यक जटिलता की तरह लग रहा है। क्या एक इंजेक्शन की संभावना है (और क्या यह वास्तव में एक को ठीक करता है)? [मुझे नहीं पता कि पोस्टग्रैज को तालिका के नामों की अनुमति देने के लिए पर्याप्त मूर्खतापूर्ण है] अगर वहाँ है, तो आपको वास्तव में उत्तर में एक टिप्पणी को संपादित करने के लिए अपनी टिप्पणी को बदलना चाहिए (यह बताते हुए कि संपादन टिप्पणियों में क्यों है)।
शुभ

@ एसेक्स हेह, यह पूर्व संस्करण के साथ कुछ मुद्दा था जब मैं ऐसा कर रहा था। अभी याद नहीं कर सकते ...
tyger

127

यदि आप जो कुछ गिराना चाहते हैं , वह उसी उपयोगकर्ता के स्वामित्व में है, तो आप इसका उपयोग कर सकते हैं:

drop owned by the_user;

यह वह सब कुछ छोड़ देगा जो उपयोगकर्ता का मालिक है।

इसमें भौतिक विचार, विचार, क्रम, ट्रिगर, स्कीमा, फ़ंक्शंस, प्रकार, समुच्चय, ऑपरेटर, डोमेन और इतने पर (इसलिए, वास्तव में: सब कुछ ) शामिल है जो the_userस्वामी (= निर्मित) शामिल है।

आपको the_userवास्तविक उपयोगकर्ता नाम से बदलना होगा, वर्तमान में "वर्तमान उपयोगकर्ता" के लिए सब कुछ छोड़ने का कोई विकल्प नहीं है। आगामी 9.5 संस्करण में विकल्प होगा drop owned by current_user

मैनुअल में अधिक जानकारी: http://www.postgresql.org/docs/current/static/sql-drop- प्रसिद्ध


2
इसने उपयोगकर्ता द्वारा स्वामित्व वाले सभी स्कीमाओं को गिरा दिया (जो मैं नहीं करना चाहता था)।
पीटर एल

4
@PeterL: जिसे स्पष्ट रूप से मैनुअल में प्रलेखित किया गया है, लेकिन मैंने अपनी पोस्ट को यह स्पष्ट करने के लिए संपादित किया है कि "सब कुछ" का वास्तव में मतलब है
a_horse_with_no_name

मैं current_user के स्वामित्व वाली ड्रॉप का उपयोग करूंगा; इस तरह आपको सही उपयोगकर्ता नाम लिखने के बारे में चिंता करने की ज़रूरत नहीं है।
JavaGeek

2
वास्तव में मेरे लिए एक बहुत अच्छा समाधान है। मेरा डेटाबेस और publicस्कीमा के स्वामित्व में है postgres, लेकिन बाकी सब कुछ एक विशिष्ट उपयोगकर्ता के स्वामित्व में है, इसलिए उस उपयोगकर्ता के स्वामित्व वाली सभी चीज़ों को छोड़ने से स्कीमा को छोड़कर डेटाबेस साफ़ हो जाता है ।
शुभ

ध्यान दें कि प्रलेखन कहता है कि यह विशेषाधिकारों को रद्द कर देगा, लेकिन यदि आप इसे सामान्य उपयोगकर्ता के रूप में चलाते हैं तो यह नहीं हो सकता है, इसलिए यह सिर्फ तालिकाओं और इसी तरह छोड़ता है, जो वास्तव में मैं चाहता हूं। अच्छा!
ChetPrickles

76

ऊपर पाब्लो के अनुसार, मामले के संबंध में, एक विशिष्ट स्कीमा से गिराने के लिए:

select 'drop table "' || tablename || '" cascade;' 
from pg_tables where schemaname = 'public';

मैंने इसका इस्तेमाल किया, जिसने मेरे लिए काम किया। मुझे लगता है कि where schemaname='public'हिस्सा महत्वपूर्ण है?
आइबिक

1
@ आइबिक यदि आप छोड़ देते हैं कि आप संभावित रूप से सभी आंतरिक पोस्टग्रैब टेबल को हटाने की कोशिश कर सकते हैं, तो सबसे अधिक संभावना है कि आप क्या चाहते हैं।
व्हर्ल्विन

49
drop schema public cascade;

चाल चलनी चाहिए।


10
ध्यान दें कि यह सार्वजनिक स्कीमा में परिभाषित सभी कार्यों, विचारों आदि को भी हटा देगा।
जो वान डायक

6
इसके साथ ही आपको टेबल को फिर से जोड़ने के लिए बाद में फिर से बनाना होगा CREATE SCHEMA public;। अधिक जानकारी के लिए stackoverflow.com/a/14286370
mikermcneil

29

पाब्लो और लेनडब्ल्यू के बाद, यहां एक-लाइनर है जो इसे तैयार करने और फिर क्रियान्वित करने दोनों करता है:

psql -U $PGUSER $PGDB -t -c "select 'drop table \"' || tablename || '\" cascade;' from pg_tables where schemaname = 'public'" | psql -U $PGUSER $PGDB

NB: या तो सेट करें या प्रतिस्थापित करें $PGUSERऔर $PGDBअपने इच्छित मानों के साथ


22

यदि आपके पास PL / PGSQL प्रक्रियात्मक भाषा स्थापित है, तो आप बिना शेल / पर्ल बाहरी स्क्रिप्ट के सब कुछ हटाने के लिए निम्नलिखित का उपयोग कर सकते हैं।

DROP FUNCTION IF EXISTS remove_all();

CREATE FUNCTION remove_all() RETURNS void AS $$
DECLARE
    rec RECORD;
    cmd text;
BEGIN
    cmd := '';

    FOR rec IN SELECT
            'DROP SEQUENCE ' || quote_ident(n.nspname) || '.'
                || quote_ident(c.relname) || ' CASCADE;' AS name
        FROM
            pg_catalog.pg_class AS c
        LEFT JOIN
            pg_catalog.pg_namespace AS n
        ON
            n.oid = c.relnamespace
        WHERE
            relkind = 'S' AND
            n.nspname NOT IN ('pg_catalog', 'pg_toast') AND
            pg_catalog.pg_table_is_visible(c.oid)
    LOOP
        cmd := cmd || rec.name;
    END LOOP;

    FOR rec IN SELECT
            'DROP TABLE ' || quote_ident(n.nspname) || '.'
                || quote_ident(c.relname) || ' CASCADE;' AS name
        FROM
            pg_catalog.pg_class AS c
        LEFT JOIN
            pg_catalog.pg_namespace AS n
        ON
            n.oid = c.relnamespace WHERE relkind = 'r' AND
            n.nspname NOT IN ('pg_catalog', 'pg_toast') AND
            pg_catalog.pg_table_is_visible(c.oid)
    LOOP
        cmd := cmd || rec.name;
    END LOOP;

    FOR rec IN SELECT
            'DROP FUNCTION ' || quote_ident(ns.nspname) || '.'
                || quote_ident(proname) || '(' || oidvectortypes(proargtypes)
                || ');' AS name
        FROM
            pg_proc
        INNER JOIN
            pg_namespace ns
        ON
            (pg_proc.pronamespace = ns.oid)
        WHERE
            ns.nspname =
            'public'
        ORDER BY
            proname
    LOOP
        cmd := cmd || rec.name;
    END LOOP;

    EXECUTE cmd;
    RETURN;
END;
$$ LANGUAGE plpgsql;

SELECT remove_all();

"Psql" प्रॉम्प्ट पर इसे टाइप करने के बजाय मैं आपको इसे किसी फ़ाइल में कॉपी करने का सुझाव दूंगा और फिर "--file" या "-f" विकल्पों का उपयोग करके psql में इनपुट के रूप में फ़ाइल पास करूंगा:

psql -f clean_all_pg.sql

क्रेडिट जहां क्रेडिट की वजह से है: मैंने फ़ंक्शन लिखा है, लेकिन लगता है कि प्रश्न (या पहले कम से कम) वर्षों पहले किसी pgsql मेलिंग सूची में से किसी पर आया था। जब या जो वास्तव में याद नहीं है।


20

यदि आप किसी भी तरह से सभी तालिकाओं को बनाना चाहते हैं, तो आप सभी तालिकाओं को एकल कथन में डालकर कैसिटैड जैसे उपनामों के साथ फैला सकते हैं। यह निष्पादन को भी तेज करता है।

SELECT 'TRUNCATE TABLE ' || string_agg('"' || tablename || '"', ', ') || ';' 
FROM pg_tables WHERE schemaname = 'public';

इसे सीधे निष्पादित करना:

DO $$
DECLARE tablenames text;
BEGIN    
    tablenames := string_agg('"' || tablename || '"', ', ') 
        FROM pg_tables WHERE schemaname = 'public';
    EXECUTE 'TRUNCATE TABLE ' || tablenames;
END; $$

बदलें TRUNCATEके साथ DROPभी लागू हो।


1
जब publicस्कीमा पर काम नहीं कर रहा है , तो स्कीमा नाम को अभिव्यक्ति में शामिल करना न भूलें: string_agg(quote_ident(schemaname) || '.' || quote_ident(tablename), ', ')केवल टेबल नामों को पारित करने के बजाय।
B12Toaster

15

मैंने एक एकल स्ट्रिंग के रूप में लौटाए गए SQL कमांडों की सुविधा के लिए पाब्लो के उत्तर को थोड़ा संशोधित किया:

select string_agg('drop table "' || tablename || '" cascade', '; ') 
from pg_tables where schemaname = 'public'

14

इस स्क्रिप्ट का उपयोग pgAdmin में करें:

DO $$
DECLARE 
    brow record;
BEGIN
    FOR brow IN (select 'drop table "' || tablename || '" cascade;' as table_name from pg_tables where schemaname = 'public') LOOP
        EXECUTE brow.table_name;
    END LOOP;
END; $$

वह वर्ग मेरे लिए विफल रहा। मैंने Select concat ('drop table', tablename, 'cascade;') AS drop_table_sql FROM pg_tables के रूप में इस्तेमाल किया है जहाँ = 'जनता'
कीथ जॉन हचिसन

1
कुछ गलत किया होगा, लुका। मैंने बस फिर से कोशिश की और यह काम कर गया।
कीथ जॉन हचिसन

11

बस के मामले में ... सरल अजगर स्क्रिप्ट जो Postgresql डेटाबेस को साफ करती है

import psycopg2
import sys

# Drop all tables from a given database

try:
    conn = psycopg2.connect("dbname='akcja_miasto' user='postgres' password='postgres'")
    conn.set_isolation_level(0)
except:
    print "Unable to connect to the database."

cur = conn.cursor()

try:
    cur.execute("SELECT table_schema,table_name FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_schema,table_name")
    rows = cur.fetchall()
    for row in rows:
        print "dropping table: ", row[1]   
        cur.execute("drop table " + row[1] + " cascade") 
    cur.close()
    conn.close()        
except:
    print "Error: ", sys.exc_info()[1]

सुनिश्चित करें कि इसे कॉपी करने के बाद इंडेंटेशन सही है क्योंकि पायथन इस पर निर्भर है।


1
काम लाइन एक आकर्षण। मैंने इसे उठाया क्योंकि मुझे db कनेक्शन की जानकारी को हार्डकोड करना पसंद था - आखिरी बात जो मैं करना चाहता हूं वह गलत DB को मार रहा है! और, मेरी तालिका सूची भी एक लक्ष्य है।
JL Peyret

9

DROP टेबल के लिए एकदम सही, अल्पविराम से अलग की गई सूची बनाने के लिए आप string_agg फ़ंक्शन का उपयोग कर सकते हैं। एक बैश स्क्रिप्ट से:

#!/bin/bash
TABLES=`psql $PGDB -t --command "SELECT string_agg(table_name, ',') FROM information_schema.tables WHERE table_schema='public'"`

echo Dropping tables:${TABLES}
psql $PGDB --command "DROP TABLE IF EXISTS ${TABLES} CASCADE"

होना चाहिए #! / बिन / श
अच्छा व्यक्ति

8

यदि आप डेटा हटाना चाहते हैं (टेबल नहीं हटाएं):

-- Truncate tables and restart sequnces
SELECT 'TRUNCATE TABLE "' || table_schema || '"."' || table_name || '" RESTART IDENTITY CASCADE;' 
FROM information_schema.tables 
WHERE table_catalog = '<database>' AND table_schema = '<schema>';

या यदि आप ड्रॉप टेबल चाहते हैं तो आप इस sql का उपयोग कर सकते हैं:

-- For tables
SELECT 'DROP TABLE "' || table_schema || '"."' || table_name || '" CASCADE;' 
FROM information_schema.tables 
WHERE table_catalog = '<database>' AND table_schema = '<schema>';

-- For sequences
SELECT 'DROP SEQUENCE d_a_seq "' || sequence_schema || '"."' || sequence_name || '";' 
FROM information_schema.sequences 
WHERE sequence_catalog = '<database>' AND sequence_schema = '<schema>';

8

नोट: मेरा जवाब तालिकाओं और अन्य डेटाबेस ऑब्जेक्ट्स को हटाने के बारे में है; तालिकाओं में सभी डेटा को हटाने के लिए , यानी सभी तालिकाओं को काटकर, एंड्रे दोनों ने एक महीने बाद एक समान रूप से अच्छी तरह से निष्पादित (प्रत्यक्ष निष्पादन) विवरण प्रदान किया है।

ऐसे मामलों में जहां आप न सिर्फ कर सकते हैं के लिए DROP SCHEMA public CASCADE;, DROP OWNED BY current_user;या कुछ और, यहाँ एक स्टैंड-अलोन SQL स्क्रिप्ट मैंने लिखा है, जो लेन-देन सुरक्षित (यानी आप इसे के बीच डाल सकते है BEGIN;और या तो ROLLBACK;सिर्फ परीक्षण करने के लिए इसे बाहर या COMMIT;और वास्तव में करने के लिए काम करते हैं) "सभी" डेटाबेस ऑब्जेक्ट्स को साफ करता है ... ठीक है, हमारे द्वारा उपयोग किए गए डेटाबेस में उपयोग किए गए सभी या मैं समझदारी से जोड़ सकता हूं, जो है:

  • मेज पर ट्रिगर
  • तालिकाओं पर अवरोध (FK, PK CHECK, UNIQUE)
  • सूचकांकों
  • VIEWएस (सामान्य या भौतिक)
  • टेबल
  • दृश्यों
  • दिनचर्या (कुल कार्य, कार्य, प्रक्रियाएं)
  • सभी n alln- डिफ़ॉल्ट (यानी नहीं publicया DB- आंतरिक) स्कीमाटा "हम" स्वयं: स्क्रिप्ट उपयोगी है जब "डेटाबेस सुपरयुजर नहीं" के रूप में चलाया जाता है; एक सुपरयुसर सभी स्कीमाटा को गिरा सकता है (वास्तव में महत्वपूर्ण अभी भी स्पष्ट रूप से बाहर रखा गया है, हालांकि)
  • एक्सटेंशन (उपयोगकर्ता-योगदान लेकिन मैं आमतौर पर जानबूझकर उन्हें छोड़ देता हूं)

गिराए नहीं गए (कुछ जानबूझकर; कुछ केवल इसलिए कि मेरे डीबी में कोई उदाहरण नहीं था):

  • publicस्कीमा (उन में विस्तार-प्रदान की सामग्री के लिए जैसे)
  • collations और अन्य स्थानीय सामान
  • घटना ट्रिगर
  • पाठ खोज सामान, ... ( अन्य सामग्री के लिए यहाँ देखें जो मुझे याद हो सकता है)
  • भूमिकाएँ या अन्य सुरक्षा सेटिंग्स
  • मिश्रित प्रकार
  • टोस्ट टेबल
  • FDW और विदेशी तालिकाओं

यह उन मामलों के लिए वास्तव में उपयोगी है जब आप जिस डंप को पुनर्स्थापित करना चाहते हैं वह एक अलग डेटाबेस स्कीमा संस्करण का होता है (जैसे डेबियन dbconfig-common, फ्लाईवे या लिक्विबेस / डीबी-मानुल के साथ ) डेटाबेस से जिसे आप इसे पुनर्स्थापित करना चाहते हैं।

मुझे एक संस्करण भी मिला है जो "दो तालिकाओं को छोड़कर सब कुछ हटा देता है और जो उनका है" (एक अनुक्रम, मैन्युअल रूप से परीक्षण किया गया, क्षमा करें, मुझे पता है, उबाऊ) अगर किसी को दिलचस्पी है; अंतर छोटा है। मुझसे संपर्क करें या रुचि होने पर इस रेपो की जांच करें

एसक्यूएल

-- 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; $$;

पोस्टग्रेएसक्यूएल 9.6 ( ) पर बाद के परिवर्धन ( क्लेमेंट प्रिवोस्टextensions द्वारा योगदान ) को छोड़कर, परीक्षण किया गया । सकल हटाने का परीक्षण 9.6 और 12.2 पर किया गया, प्रक्रिया हटाने का परीक्षण 12.2 पर भी किया गया। Bugfixes और आगे सुधार का स्वागत करते हैं!jessie-backports


उपरोक्त स्क्रिप्ट में त्रुटियां हैं क्योंकि यह कार्यों और प्रक्रियाओं के बीच अंतर नहीं करता है: DROP FUNCTIONएक प्रक्रिया के लिए विफल रहता है, और इसके विपरीत। मैंने समारोह अनुभाग को इसमें संशोधित किया: AND pp.prokind ='f' -- FunctionयाAND pp.prokind ='p' -- Procedure
बोगेमैन

1
@BogeyMan यह एक त्रुटि नहीं है, कुल कार्यों के चूक को प्रलेखित किया गया था और स्क्रिप्ट को केवल 9.6 पर परीक्षण किया गया था। लेकिन मैंने आपकी टिप्पणी को दिल से लिया और इसे proisaggaggreg 10.x पर समुच्चय ( ) और prokind) 11 पर समुच्चय और प्रक्रियाओं ( ) (गतिशील रूप से जांचा गया) और संकेत के लिए धन्यवाद दोनों को संभालने के लिए अनुकूलित किया।
मिराबिलोस

8

यह एक बहुत ही दिलचस्प सवाल है, और आप इसे कई तरीकों से करेंगे। मुझे उम्मीद है कि यह आपके लिए उपयोगी होगा।

  1. वर्तमान स्कीमा को छोड़ने और पुनः बनाने के द्वारा

यहाँ, सामान्य तौर पर, हमारे पास publicडिफ़ॉल्ट रूप से एक स्कीमा है। इसलिए, मैं इसे एक उदाहरण के रूप में उपयोग कर रहा हूं।

DROP SCHEMA `public` CASCADE;
CREATE SCHEMA `public`;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;

यदि आप PostgreSQL 9.3 या अधिक का उपयोग कर रहे हैं, तो आपको डिफ़ॉल्ट अनुदान को पुनर्स्थापित करने की भी आवश्यकता हो सकती है।

पेशेवरों:

यह एक संपूर्ण स्कीमा को साफ करेगा और इसे एक नए के रूप में फिर से बनाएगा।

विपक्ष:

आप अन्य संस्थाओं को भी खो देंगे तरह Functions, Views, Materialized views, आदि

  1. तालिका से सभी तालिका नामों का उपयोग करके pg_tables

PostgreSQL अपने रिकॉर्ड टेबल पर सभी तालिकाओं को नामित करता है pg_table

SELECT
  'DROP TABLE IF EXISTS "' || tablename || '" CASCADE;' 
from
  pg_tables WHERE schemaname = 'public';

जैसा कि आप देख सकते हैं, सबक्वेरी के उपयोग से, हम स्कीमा से पूरी तालिकाओं को हटा सकते हैं।

पेशेवरों:

जब अन्य डेटा इकाइयां महत्वपूर्ण होती हैं और आप स्कीमा से केवल तालिकाओं को हटाना चाहते हैं, तो यह दृष्टिकोण वास्तव में आपके लिए उपयोगी होगा।


6

आपको तालिकाओं और अनुक्रमों को छोड़ने की आवश्यकता है, यहां मेरे लिए काम किया गया है

psql -qAtX -c "select 'DROP TABLE IF EXISTS ' || quote_ident(table_schema) || '.' || quote_ident(table_name) || ' CASCADE;' FROM information_schema.tables where table_type = 'BASE TABLE' and not table_schema ~ '^(information_schema|pg_.*)$'" | psql -qAtX
psql -qAtX -c "select 'DROP SEQUENCE IF EXISTS ' || quote_ident(relname) || ' CASCADE;' from pg_statio_user_sequences;" | psql -qAtX

आप के लिए sudo / सु की जरूरत हो सकती इससे पहले कि आप आदेश चला postgres(निर्यात कनेक्शन विवरणों के उपयोगकर्ता या PGHOST, PGPORT, PGUSERऔर PGPASSWORD) और फिरexport PGDATABASE=yourdatabase


5

वर्तमान डेटाबेस में सभी तालिकाओं को नष्ट करने के लिए रेल के लिए रेक कार्य

namespace :db do
  # rake db:drop_all_tables
  task drop_all_tables: :environment do
    query = <<-QUERY
      SELECT
        table_name
      FROM
        information_schema.tables
      WHERE
        table_type = 'BASE TABLE'
      AND
        table_schema NOT IN ('pg_catalog', 'information_schema');
    QUERY

    connection = ActiveRecord::Base.connection
    results    = connection.execute query

    tables = results.map do |line|
      table_name = line['table_name']
    end.join ", "

    connection.execute "DROP TABLE IF EXISTS #{ tables } CASCADE;"
  end
end

1
यह कहने के लिए सरल और सुरक्षित हो सकता है और उस सूची में IN_ के बजाय table_schema = 'public' नहीं है।
स्टीव

किसी कारण से मेरा स्कीमा आबादी वाले डेटा के साथ बनाया गया था। यह रेक काम करता है। इसलिए करने के बाद rake db:create, मैं इसे चलाता हूं। आप स्टीव टिप करते हैं और कोड हटा सकते हैं table_name = और परिवर्तन ", "के लिए ","और #{ tables }के लिए#{tables}
वाशिंगटन Botelho

4

मैंने विचारों को ध्यान में रखते हुए जैमी से बैश विधि को बढ़ाया क्योंकि उनका एकमात्र टेबल प्रकार "बेस टेबल" का सम्मान करता है जो डिफ़ॉल्ट है।

निम्नलिखित बैश कोड पहले विचारों को हटाता है और फिर बाकी सभी को

#!/usr/bin/env bash

PGDB="yourDB"
# By exporting user & pass your dont need to interactively type them on execution
export PGUSER="PGusername"
export PGPASSWORD="PGpassword"

VIEWS=`psql -d $PGDB -t --command "SELECT string_agg(table_name, ',') FROM information_schema.tables WHERE table_schema='public' AND table_type='VIEW'"`
BASETBLS=`psql -d $PGDB -t --command "SELECT string_agg(table_name, ',') FROM information_schema.tables WHERE table_schema='public' AND table_type='BASE TABLE'"`

echo Dropping views:${VIEWS}
psql $PGDB --command "DROP VIEW IF EXISTS ${VIEWS} CASCADE"
echo Dropping tables:${BASETBLS}
psql $PGDB --command "DROP TABLE IF EXISTS ${BASETBLS} CASCADE"

महान स्क्रिप्ट ... बस इसका इस्तेमाल किया और एक आकर्षण की तरह काम किया। मैंने अनुक्रमों के लिए एक पंक्ति भी जोड़ी: SEQUENCES =psql -d $PGDB -t --command "SELECT string_agg(sequence_name, ',') FROM information_schema.sequences WHERE sequence_schema='public' AND sequence_catalog='$PGDB'"
raminr

4

Windows बैच फ़ाइल में:

@echo off
FOR /f "tokens=2 delims=|" %%G IN ('psql --host localhost --username postgres --command="\dt" YOUR_TABLE_NAME') DO (
   psql --host localhost --username postgres --command="DROP table if exists %%G cascade" sfkb
   echo table %%G dropped
)

4

निम्नलिखित कदम सहायक हो सकते हैं (लिनक्स उपयोगकर्ताओं के लिए):

  1. पहले postgresकमांड के बाद कमांड प्रॉम्प्ट डालें :

    sudo -u postgres psql
  2. इस आदेश द्वारा डेटाबेस दर्ज करें (मेरा डेटाबेस नाम है:) maoss:

    \c maoss
  3. अब सभी तालिकाओं को छोड़ने के लिए कमांड दर्ज करें:

    DROP SCHEMA public CASCADE;
    CREATE SCHEMA public;
    
    GRANT ALL ON SCHEMA public TO postgres;
    GRANT ALL ON SCHEMA public TO public;

1
मेरे ubuntu 19.04 पर कदमों का पालन किया, यह निर्दोष रूप से काम किया!
अलेक्जेंड्रू-मिहाई मनोलेस्कु

1
@FaridLU ने बहुत मदद की, धन्यवाद!
जस्टिन वुड

2

ठीक है, क्योंकि मुझे कमांड लाइन से काम करना पसंद है ...

psql -U <user> -d <mydb> -c '\dt' | cut -d ' ' -f 4 | sed -e "s/^/drop table if exists /" | sed -e "s/$/;/"

-c '\dt' सूची तालिकाओं आदेश को लागू करेगा।

List of relations Schema | Name | Type | Owner --------+-------------------+-------+---------- public | _d_psidxddlparm | table | djuser public | _d_psindexdefn | table | djuser

cut -d ' ' -f 4 अब, 4 डी फ़ील्ड (जब विभाजक के रूप में अंतरिक्ष का उपयोग करके) को हथियाने के लिए इसके आउटपुट को पाइप करें, जो कि तालिका है।

sedइसके बाद कमांड विभाजक को drop tableप्रत्यय देने और प्रत्यय लगाने के लिए उपयोग किया जाता है ;

| egrep '_d_'- इसे grepकुछ और में पाइप करें और आप और अधिक चयनात्मक हो सकते हैं कि आप किस टेबल को छोड़ते हैं।

drop table if exists _d_psidxddlparm; drop table if exists _d_psindexdefn;

नोट: जैसा कि लिखा गया है, यह \dtअंत में कॉलम हेडर और कुल पंक्तियों के कमांड आउटपुट के लिए फर्जी पंक्तियों को उत्पन्न करेगा । मैं टाल-मटोल करके उससे बचता हूं, लेकिन आप इस्तेमाल कर सकते हैं headऔर tail


2

सबसे आसान तरीका सार्वजनिक स्कीमा को छोड़ देना है क्योंकि अन्य लोगों ने पिछले उत्तरों में सुझाव दिया है। हालाँकि, यह एक अच्छा तरीका नहीं है। आप कभी नहीं जानते कि सार्वजनिक स्कीमा में क्या किया गया है जो तब से भूल गया है और दस्तावेज नहीं किया गया था। आप यह भी नहीं जानते कि क्या यह भविष्य में भी काम करेगा। V9 में, यह ठीक होता, लेकिन V10 में आपके सभी उपयोगकर्ता स्कीमा तक पहुंच को ढीला कर देंगे, और उन्हें फिर से एक्सेस दी जानी चाहिए अन्यथा आपका एप्लिकेशन टूट जाएगा। मैंने V11 की जाँच नहीं की है, लेकिन मुद्दा यह है कि आप कभी नहीं जानते कि मशीन से मशीन, साइट से साइट या संस्करण से संस्करण में जाने पर क्या टूट जाएगा। यह भी नहीं किया जा सकता है यदि आप एक उपयोगकर्ता हैं जो डेटाबेस तक पहुंच रखते हैं, लेकिन स्कीमा के लिए नहीं।

यदि आपको यह प्रोग्रामेटिक रूप से करने की आवश्यकता है, तो ऊपर दिए गए अन्य उत्तर इसे कवर करते हैं, लेकिन ऊपर दिए गए उत्तरों में से एक बात आपके लिए काम करने के लिए पोस्टग्रेज प्राप्त करना है। यदि आप नीचे दिए गए विकल्प के साथ pg_dump का उपयोग करते हैं:

sudo su postgres -c "pg_dump -U postgres WhateverDB -c -f "/home/Anyone/DBBackupWhateverDB-ServerUnscheduled.sql""

यह sql स्टेटमेंट के साथ DB रिस्टोर स्क्रिप्ट बनाएगा जो सभी टेबल को डिलीट कर देगा।

यदि प्रश्न पूछने का एकमात्र उद्देश्य पुनर्स्थापना से पहले तालिकाओं को हटाना था, तो आपका पुनर्स्थापना आपके लिए काम करेगा।

हालाँकि, यदि आपको किसी और चीज़ के लिए इसकी आवश्यकता है, तो आप बस sql स्क्रिप्ट से ड्रॉप स्टेटमेंट कॉपी कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.