পোস্টগ্র্রেএসকিউএল ডাটাবেসে আমি কীভাবে সমস্ত টেবিলগুলি ফেলে দিতে পারি?


1039

কমান্ড লাইন থেকে কাজ করে পোস্টগ্র্রেএসকিউএল-এ আমি কীভাবে সমস্ত টেবিলগুলি ফেলে দিতে পারি?

আমি নিজেই ডাটাবেসটি ফেলে দিতে চাই না , কেবলমাত্র সমস্ত টেবিল এবং সেগুলির মধ্যে সমস্ত ডেটা।


3
আপনি কোন কমান্ড লাইনের কথা বলছেন? আমরা জানি যে আপনি একটি উইন্ডোজ পাওয়ারশেল বাস্তবায়ন খুঁজছেন।
গ্রেগ স্মিথ

4
দুঃখিত। কমান্ড লাইনে 'পিএসকিএল' টাইপ করার পরে ইউনিক্সে কাজ করা - তাই পিএসকিএল-র কমান্ড-লাইন পরিবেশ নিজেই।
এপি 257

101
ড্রপ স্কেমার সর্বজনীন ক্যাসকেড; - কাঁপুনি
ওয়াইল্ডপ্লেজার

20
@ 0fnt আপনি করতে হবে 'পাবলিক তৈরি করুন;' আবার নতুন টেবিল যুক্ত করতে (শক্ত
উপায়টি

4
বিটিডাব্লু, আপনি যখন ড্রপ করবেন তখন publicকোনও ইনস্টলড এক্সটেনশন হারাবেন।
সুডো

উত্তর:


1371

যদি আপনার সমস্ত টেবিল একক স্কিমাতে থাকে তবে এই পদ্ধতির কাজ করতে পারে (কোডের নীচে ধরে নেওয়া হয় যে আপনার স্কিমার নাম 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
এটি আপনার হিসাবে পিএসএইচএল-এ লগ ইন করা ব্যবহারকারীকে স্কিমা ডাব্লু / ওউনার সেট তৈরি করবে। এটি ডাব্লু / অ্যাপ্লিকেশনগুলিকে দ্বন্দ্ব করবে যারা পৃথক ব্যবহারকারী হিসাবে লগ ইন করে। সেক্ষেত্রে আপনারও "পোস্টারগ্রেস করার জন্য অলটার স্কেল পাবলিক মালিকানা চালানো দরকার;" (বা আপনার অ্যাপ্লিকেশন টেবিলগুলি তৈরি করতে যে কোনও ব্যবহারকারীর কাছে)
mgojohn

13
এটি অন্য একটি উত্তর থেকে তুলে ধরে আপনি সম্ভবত GRANT ALL ON SCHEMA public TO public;তৈরির পরে কিছু পেতে চান ।
ফেডারিকো

1
@ ফেডেরিকো আপনি GRANT ALLতৈরির পরে কেন চাইবেন ?
425nesp

408

আপনি এসকিউএল স্ক্রিপ্টটি তৈরি করতে এর জন্য একটি কোয়েরি লিখতে পারেন:

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

এবং তারপর এটি চালান।

গৌরবময় কপি + পাসও কাজ করবে।


15
আমি মনে করি আপনি বোঝাতে চেয়েছিলেন: আপনি এই জাতীয় একটি কোয়েরি লিখতে পারেন ... ... এবং তারপরে ক্যোয়ারির আউটপুটটি চালান
ভিঙ্কো ভার্সালোভিক

5
'উপস্থিত থাকলে ড্রপ টেবিল নির্বাচন করুন "' || টেবিলের নাম || '" ক্যাসকেড;' pg_tables থেকে; নিশ্চিত করবে যে বড় হাতের টেবিলগুলিও যথাযথভাবে বাদ পড়েছে।
আইভো ভ্যান ডের উইজক

12
দফা "কোথায় schemaname = 'পাবলিক'" LenW তার উত্তরে বলেন যে শুধুমাত্র ডাটাবেসের আপনি পরিচালিত এবং সিস্টেমের বেশী না মুছে ফেলার সুযোগ কমাতে খুবই উপযোগী হতে পারে
Guillaume, Gendre

8
@jwg: এছাড়াও, কারণ কখনও কখনও আপনার কাছে অনুমতি নেই drop schema public cascade;তবে প্রায়শই আপনার কাছে টেবিলগুলি ফেলে দেওয়ার অনুমতি রয়েছে।
বার্কগুলি

2
সর্বজনীন স্কিমার জন্য সংস্করণ নয়: 'যদি উপস্থিত থাকে তবে ড্রপ টেবিলটি নির্বাচন করুন "" || স্কিমাননেম ||' "।" '|| টেবিলের নাম ||' "ক্যাসকেড; ' pg_tables থেকে যেখানে স্কিম্যানাম = 'ব্যবহারকারীর_ডাটা';
লুডভিগ

291

এই লেখার হিসাবে সবচেয়ে গ্রহণযোগ্য উত্তর (জানুয়ারী 2014):

drop schema public cascade;
create schema public;

এটি কাজ করে, তবে যদি আপনার উদ্দেশ্য জনসাধারণের স্কিমাটিকে ভার্জিন অবস্থায় ফিরিয়ে দেয় তবে এটি কাজটি পুরোপুরি সম্পাদন করে না। পোস্টগ্রেএসকিউএল 9.3.1 এর জন্য প্যাগএডমিন III এর অধীনে, আপনি যদি এইভাবে তৈরি করা "পাবলিক" স্কিমাটিতে ক্লিক করেন এবং "এসকিউএল ফলকে" দেখেন তবে আপনি নিম্নলিখিতটি দেখতে পাবেন:

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

আমার জন্য পাইথন ওয়েব ফ্রেমওয়ার্ক ব্যবহার করে যা পূর্ববর্তী কারণে তৈরি সমস্যাগুলি ব্যবহার করে ডাটাবেস সারণী (ওয়েব টুপি) তৈরি করে:

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

পিগএডমিন তৃতীয়তে এই কমান্ডগুলি ইস্যু করার জন্যও নোট করুন, আমি কোয়েরি সরঞ্জামটি ব্যবহার করেছি (গ্লাসিং আইকন "অ্যাব্র্যাটারি এসকিউএল কোয়েরিগুলি কার্যকর করুন") বা আপনি প্লাগইনস> পিএসকিউএল কনসোল ব্যবহার করতে পারেন

বিঃদ্রঃ

আপনার যদি কোনও এক্সটেনশন ইনস্টল থাকে তবে আপনি যখন স্কিমাটি ড্রপ করবেন তখন সেগুলি বাদ দেওয়া হবে, সুতরাং আপনার কী ইনস্টল করা দরকার তা নোট করা উচিত এবং তারপরে প্রয়োজনীয় বিবৃতিগুলি কার্যকর করতে হবে। যেমন

CREATE EXTENSION postgis;


7
নিশ্চিত করেছে। দুটি লাইন সমাধান ( dropতখন create) পোস্টগ্র্রেএসকিউএল 9.1 এ কাজ করে। 9.3 এ আপগ্রেড করার পরে, দুটি অতিরিক্ত grantপ্রয়োজন।
জিঙ্গাও শি

4
আরও একটি নিশ্চিত: জ্যাঙ্গো ব্যবহার করে, আমি একই ত্রুটি পেয়েছি; জ্যাঙ্গো ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করার আগে আমাকে এই অনুদানগুলি চালানো দরকার ছিল।
rjh

2
এটি পুরোপুরি কাজ করেছে, ব্যতীত আমাকে কিছু এক্সটেনশানগুলি পুনরায় ইনস্টল করার দরকার ছিল: বাড়ির অস্তিত্ব না থাকলে এক্সটেনশান তৈরি করুন; Pgcrypto না থাকলে এক্সটেনশন তৈরি করুন;
shacker

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

আইএমও এটির চেয়ে ভাল drop schema public, কারণ আপনার পুনরায় তৈরি করার schemaএবং সমস্ত অনুদান পুনরুদ্ধার করার দরকার নেই ।

অতিরিক্ত বোনাস যা এর জন্য বাহ্যিক স্ক্রিপ্টিং ভাষার প্রয়োজন হয় না, বা উত্পাদিত এসকিউএল-কে অনুলিপি করে আবারও অনুবাদকের কাছে অনুলিপি করা হয় না।


4
এই পোস্ট করার জন্য ধন্যবাদ! আমি drop schemaকৌশলটি ব্যবহার করতে পারিনি কারণ ব্যবহারকারী স্কিমাটির মালিক নয়, কেবল টেবিলগুলির মধ্যে। যদিও এটি কাজ করেছেন :)
vdboor

খুব পরিষ্কার এবং সুনির্দিষ্ট ... দুর্দান্ত সমাধান, এবং এটিও গ্রহণযোগ্য হওয়া উচিত - আপনি এমনকি
পোষ্টজিআইএসের

আমি এটি EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE'; দিয়ে এই লাইনটি পরিবর্তন করার পরামর্শ দেব : EXECUTE format('DROP TABLE IF EXISTS %I CASCADE', quote_ident(r.tablename));
টাইগার

@tyger কেন? এটি আমার কাছে একটি অপ্রয়োজনীয় জটিলতার মতো দেখায়। কি একটা ইনজেকশন সম্ভাবনা (এবং এই সত্যিই এক ঠিক নেই আছে যদি)? [পোস্টগ্র্রেস টেবিলের নামগুলি সম্ভব করে দেওয়ার পক্ষে যথেষ্ট বোকা কিনা তা আমি জানি না] যদি থাকে তবে আপনার উত্তরটি সম্পাদনার পরিবর্তে আপনার মন্তব্যটি পরিবর্তন করা উচিত (কেন সম্পাদনা মন্তব্যে কেন তা ব্যাখ্যা করে)।
অস্পেক্স

@ অ্যাসপেক্স হেইহ, আমি যখন এটি করছিলাম তখন এটি পূর্বের বৈকল্পিক সম্পর্কে কিছুটা সমস্যা ছিল। এই মুহুর্তে মনে করতে পারি না ...
টাইগার 31'19

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-owned.html


2
এটি ব্যবহারকারীর মালিকানাধীন সমস্ত স্কিমা বাদ দিয়েছে (যা আমি করতে চাইনি)।
পিটার এল

4
@ পিটারএল: যা ম্যানুয়ালটিতে স্পষ্টভাবে নথিবদ্ধ, তবে আমি আমার পোস্টটি সম্পাদনা করে পরিষ্কার করে দিয়েছিলাম যে "সবকিছু" আসলেই সমস্ত কিছু
a_horse_with_no_name

আমি কারেন্ট_উসারের মালিকানাধীন ড্রপ ব্যবহার করব; এইভাবে আপনাকে সঠিক ব্যবহারকারীর নামটি টাইপ করার বিষয়ে চিন্তা করতে হবে না।
জাভাগীক

2
আসলে আমার জন্য খুব ভাল সমাধান। আমার ডাটাবেস এবং publicস্কিমা মালিকানাধীন postgres, তবে অন্য সমস্ত কিছু নির্দিষ্ট ব্যবহারকারীর মালিকানাধীন, সুতরাং সেই ব্যবহারকারীর মালিকানাধীন সবকিছু বাদ দিয়ে স্কিমা ব্যতীত ডাটাবেস সাফ হয়ে যায় ।
অস্পেক্স

নোট করুন যে ডকুমেন্টেশনটি বলেছে এটি সুবিধাগুলি প্রত্যাহার করবে কিন্তু আপনি যদি এটি সাধারণ ব্যবহারকারী হিসাবে চালান তবে এটি পারবেন না, সুতরাং এটি কেবল টেবিলগুলি এবং এর মতো বাদ দেয় যা আমি চাই। নিস!
চেটপ্রিক্লস

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

নোট: হয় সেট করুন বা প্রতিস্থাপন করুন $PGUSERএবং $PGDBআপনার পছন্দসই মানগুলি সহ


22

আপনার যদি PL / PGSQL পদ্ধতিগত ভাষা ইনস্টল থাকে তবে আপনি শেল / পার্ল বাহ্যিক স্ক্রিপ্ট ব্যতীত সমস্ত কিছু সরাতে নিম্নলিখিতটি ব্যবহার করতে পারেন following

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();

"পিএসএকএল" প্রম্পটে এটি টাইপ করার পরিবর্তে আমি আপনাকে একটি ফাইলের অনুলিপি করতে এবং তারপরে ফাইলটিকে "--file" বা "-f" বিকল্পগুলি ব্যবহার করে পিএসকিএল-তে ইনপুট হিসাবে পাস করার পরামর্শ দিচ্ছি:

psql -f clean_all_pg.sql

ক্রেডিট যেখানে creditণ জমা আছে: আমি ফাংশনটি লিখেছি, তবে মনে করি প্রশ্নগুলি (বা কমপক্ষে প্রথমটি) বছর আগে পিজএসকিএল মেইলিং তালিকার একজনের কাছ থেকে এসেছে। কখন বা কোনটি ঠিক মনে নেই।


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), ', ')কেবল সারণির নামগুলি পাস করার পরিবর্তে।
বি

15

উত্পন্ন এসকিউএল কমান্ডগুলি একক স্ট্রিং হিসাবে ফিরে আসার সুবিধার জন্য আমি পাবলোর উত্তরটি কিছুটা সংশোধন করেছি:

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

14

এই স্ক্রিপ্টটি পিজএডমিনে ব্যবহার করুন:

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

আমার জন্য স্ক্যুয়েল ব্যর্থ হয়েছে। আমি সিলেক্ট কনক্যাট ব্যবহার করেছি ('ড্রপ টেবিল', টেবিলের নাম, 'ক্যাসকেড;') এএসপি ড্রপ_সারণযোগ্য_এসকিএল থেকে যেখানে স্কিমে নাম = 'পাবলিক'
কিথ জন হাচিসন

1
লুকা নিশ্চয়ই আমার কিছু ভুল হয়েছে। আমি এটি আবার চেষ্টা করেছি এবং এটি কাজ করেছে।
কিথ জন হাচিসন

11

সেক্ষেত্রে ... সরল পাইথন স্ক্রিপ্ট যা পোস্টগ্র্যাস্কিল ডাটাবেস পরিষ্কার করে

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
লাইন একটি কবজ কাজ করে। আমি এটি বাছাই করেছি কারণ আমি ডিবি সংযোগের তথ্য হার্ডকোডিং করতে পছন্দ করেছি - সর্বশেষে আমি যা করতে চাই তা ভুল ডিবি হিট করা! এবং, এছাড়াও, আমার সারণী তালিকাটি একটি চলন্ত লক্ষ্য।
জেএল পিয়েরেট

9

ড্রো টেবিলের জন্য নিখুঁত, কমা-বিভাজিত তালিকা তৈরি করতে আপনি স্ট্রিং_এগ ফাংশনটি ব্যবহার করতে পারেন। বাশ স্ক্রিপ্ট থেকে:

#!/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>';

অথবা আপনি যদি ড্রপ টেবিল চান তবে আপনার এই স্ক্যুয়ালটি ব্যবহার করতে পারেন:

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

দ্রষ্টব্য: আমার উত্তরটি সত্যই টেবিলগুলি এবং অন্যান্য ডাটাবেস অবজেক্টগুলি মোছার বিষয়ে; জন্য সমস্ত ডেটা মুছে ফেলার মধ্যে সারণী, অর্থাত সব টেবিল ছিন্ন , Endre উভয় এক মাসে পরে একটি similarily ভালভাবে মৃত্যুদন্ড কার্যকর (সরাসরি মৃত্যুদন্ড) বিবৃতি প্রদান করেনি।

যেসব ক্ষেত্রে আপনি কেবল DROP SCHEMA public CASCADE;, DROP OWNED BY current_user;বা অন্য কিছু করতে পারবেন না , সেগুলির জন্য এখানে আমি লিখে রেখেছি একা একা এসকিউএল স্ক্রিপ্ট যা লেনদেন-নিরাপদ (যেমন আপনি এটির মধ্যে BEGIN;এবং ROLLBACK;এটি কেবল এটি পরীক্ষা করার জন্য বা COMMIT;কার্য সম্পাদন করতে পারেন) এবং "সমস্ত" ডাটাবেস অবজেক্টগুলি পরিষ্কার করে দেয় ... ভাল, আমাদের অ্যাপ্লিকেশন ব্যবহার করে এমন ডেটাবেজে ব্যবহৃত সমস্ত বা আমি বুদ্ধিমানের সাথে যুক্ত করতে পারি, যা হ'ল:

  • টেবিলের উপর ট্রিগার
  • সারণীতে সীমাবদ্ধতা (এফকে, পিকে CHECK,,UNIQUE )
  • সূচকের
  • VIEWগুলি (সাধারণ বা বস্তুগত)
  • টেবিল
  • সিকোয়েন্স
  • রুটিন (সামগ্রিক ফাংশন, ফাংশন, পদ্ধতি)
  • সমস্ত অ-ডিফল্ট (অর্থাত্‍ publicডিবি বা অভ্যন্তরীণ নয়) স্কিম্যাট “আমাদের” নিজস্ব: স্ক্রিপ্টটি কার্যকর হয় যখন "ডাটাবেস সুপারভাইজার নয়" হিসাবে চালানো হয়; একজন সুপারভাইজার সমস্ত স্কিমেটা ফেলে দিতে পারে (সত্যিকারের গুরুত্বপূর্ণগুলি এখনও স্পষ্টভাবে বাদ দেওয়া হয়, যদিও)
  • এক্সটেনশানগুলি (ব্যবহারকারী-অবদানযুক্ত তবে আমি সাধারণত ইচ্ছাকৃতভাবে এগুলিতে রেখে যাই)

বাদ দেওয়া হয়নি (কিছু কিছু ইচ্ছাকৃত; কিছু কারণ আমাদের ডিবিতে আমার কোনও উদাহরণ নেই):

  • publicস্কিমা (তাদের মধ্যে এক্সটেনশন প্রদত্ত কাপড় জন্য যেমন)
  • কোলেশন এবং অন্যান্য স্থানীয় স্টাফ
  • ইভেন্ট ট্রিগার
  • পাঠ্য অনুসন্ধান স্টাফ,… ( অন্যান্য জিনিসগুলি এখানে আমি মিস করেছি বলে দেখুন)
  • ভূমিকা বা অন্যান্য সুরক্ষা সেটিংস
  • যৌগিক প্রকারের
  • টোস্ট টেবিল
  • এফডিডাব্লু এবং বিদেশী টেবিলগুলি

আপনি যে ডাম্পটি পুনরুদ্ধার করতে চান তা কোনও ভিন্ন ডাটাবেস স্কিমা সংস্করণের (উদাহরণস্বরূপ দেবিয়ান সহ) ক্ষেত্রে এটি সত্যিই কার্যকরdbconfig-common , flyway বা Liquibase / ডিবি-Manul) ডাটাবেসের চেয়ে আপনি তা পুনরুদ্ধার করতে চান।

আমার কাছে এমন একটি সংস্করণও পাওয়া গেছে যা "দুটি টেবিল ব্যতীত সমস্ত কিছু মুছে ফেলবে এবং সেগুলির মধ্যে যা আছে" (যে অনুক্রমটি নিজেই পরীক্ষা করা হয়েছে, দুঃখিত, আমি জানি, বিরক্তিকর) যদি কেউ আগ্রহী হয় তবে; পার্থক্যটি ছোট আগ্রহী হলে আমার সাথে যোগাযোগ করুন বা এই রেপোটি পরীক্ষা করুন ।

এসকিউএল

-- 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-তেও পরীক্ষা করা হয়েছে। বাগফিক্স এবং আরও উন্নতি স্বাগত!jessie-backports


উপরের স্ক্রিপ্টে ত্রুটি রয়েছে কারণ এটি কার্য এবং পদ্ধতিগুলির মধ্যে পার্থক্য করে না: DROP FUNCTIONএকটি পদ্ধতিতে ব্যর্থ হয় এবং তদ্বিপরীত। আমি এতে ফাংশন বিভাগটি সংশোধন করেছি: AND pp.prokind ='f' -- FunctionবাAND pp.prokind ='p' -- Procedure
BogeyMan

1
@ বুজিম্যান এটি কোনও ত্রুটি নয়, সামগ্রিক ফাংশন বাদ দেওয়া ডকুমেন্টেড ছিল এবং স্ক্রিপ্টটি নথিভুক্ত করা হয়েছিল কেবল 9.6 তে পরীক্ষা করার জন্য। তবে আমি আপনার মন্তব্যটিকে হৃদয়গ্রাহ্য করেছিলাম এবং এগ্রিগেটগুলি ( proisagg) কে 10x ডলার এবং সমষ্টি এবং পদ্ধতিগুলি ( prokind) 11 ডলারে (গতিশীলভাবে পরীক্ষা করা হয়েছে) হ্যান্ডেল করার জন্য গ্রহণ করেছি এবং উভয়ই পরীক্ষা করেছি int ইঙ্গিতটির জন্য ধন্যবাদ।
মীরাবিলোস ২৩

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

পোস্টগ্রেএসকিউএল এর রেকর্ড টেবিলের নামযুক্ত সমস্ত টেবিল সঞ্চয় করে 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 / su কমান্ড করতে হতে পারে আগে আপনি নিম্নলিখিত কমান্ডটি প্রয়োগ 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
এই তালিকায় না থাকার চেয়ে ও টেবিল_সেমিটা = 'সর্বজনীন' বলা সহজ / নিরাপদ হতে পারে।
স্টিভ

কিছু কারণে আমার স্কিমা জনবহুল ডেটা দিয়ে তৈরি হয়েছিল। এই রাক কাজ করে। তাই করার পরে 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'"
রমনার

4

একটি উইন্ডোজ ব্যাচ ফাইলে:

@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
আমার উবুন্টু 19.04 এর পদক্ষেপগুলি অনুসরণ করেছে, এটি নির্বিঘ্নে কাজ করেছে!
আলেকজান্দ্রু-মিহাই মানোলেস্কু

1
@ ফরিদলু অনেক ধন্যবাদ, ধন্যবাদ!
জাস্টিন উড

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 এখন, চতুর্থ ক্ষেত্রটি (বিভাজক হিসাবে স্থান ব্যবহার করার সময়) দখল করার জন্য এর আউটপুটটি পাইপ করুন, যা সারণী।

sedএরপরে a এর উপসর্গ করতে drop tableএবং ;কমান্ড বিভাজক প্রত্যয় ব্যবহার করতে ব্যবহৃত হয় ।

| egrep '_d_'- এটি grepআরও কিছুতে পাইপ করুন এবং আপনি কোন টেবিলগুলি ফেলেছেন সে সম্পর্কে আপনি আরও নির্বাচনী হতে পারেন।

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

দ্রষ্টব্য: লিখিত হিসাবে, এটি \dtকলাম শিরোনামের কমান্ড আউটপুট এবং শেষে মোট সারিগুলির জন্য বোগাস সারি তৈরি করবে । আমি গ্রিপিংয়ের মাধ্যমে এড়াতে পারি তবে আপনি ব্যবহার করতে পারেন headএবং tail


2

সবচেয়ে সহজ উপায় হ'ল পাবলিক স্কিমাটি বাদ দেওয়া যেমন অন্যরা পূর্ববর্তী উত্তরে পরামর্শ দিয়েছে। তবে এটি একটি ভাল উপায় নয়। আপনি কখনই জানবেন না যে সর্বজনীন স্কিমায় কী করা হয়েছিল যা ভুলে গিয়েছিল এবং নথিভুক্ত হয়নি। ভবিষ্যতেও একই কাজ করবে কিনা আপনিও জানবেন না। ভি 9-তে, এটি ঠিকঠাক হত তবে ভি 10-এ আপনার সমস্ত ব্যবহারকারী স্কিমায় অ্যাক্সেস শিথিল করে রেখেছিলেন এবং অবশ্যই আবার অ্যাক্সেস দিতে হবে অন্যথায় আপনার অ্যাপ্লিকেশনটি ভেঙে যাবে। আমি ভি 11 পরীক্ষা করে দেখিনি, তবে মুল বক্তব্যটি আপনি কখনই জানেন না যে আপনি মেশিন থেকে মেশিনে, সাইট থেকে সাইটে বা সংস্করণে ভার্শন থেকে সরালে কী ভাঙ্গবে। এটি ডাটাবেসে অ্যাক্সেস ব্যবহারকারীর ব্যবহারকারী হয়ে থাকলেও স্কিমাতে না থাকলে এটি করাও যায় না।

যদি আপনাকে এই প্রোগ্রামটিমেটিকভাবে করার দরকার হয় তবে উপরের অন্যান্য উত্তরগুলি এটিকে কভার করে, তবে উপরে যে উত্তরগুলি বিবেচনা করে না তা হ'ল পোস্টগ্র্রেসকে আপনার কাজটি করানো। আপনি যদি নীচের মতো -c বিকল্পটি দিয়ে pg_dump ব্যবহার করেন:

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

এটি স্কিল স্টেটমেন্ট সহ একটি ডিবি পুনরুদ্ধার স্ক্রিপ্ট তৈরি করবে যা সমস্ত সারণী মুছে ফেলবে।

যদি প্রশ্ন জিজ্ঞাসার একমাত্র উদ্দেশ্য ছিল পুনঃস্থাপনের পূর্বে সারণীগুলি মুছে ফেলা, তবে আপনার পুনরুদ্ধারটি আপনার পক্ষে কাজ করবে।

যাইহোক, আপনার যদি অন্য কোনও প্রয়োজন হয় তবে আপনি স্কয়ার স্ক্রিপ্ট থেকে ড্রপ স্টেটমেন্টগুলি অনুলিপি করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.