විධාන රේඛාවේ සිට වැඩ කරන PostgreSQL හි සියලුම වගු අතහැර දැමිය හැක්කේ කෙසේද?
දත්ත සමුදාය අතහැර දැමීමට මට අවශ්ය නැත , සියලු වගු සහ ඒවායේ ඇති සියලුම දත්ත පමණි.
public
, ඔබට ස්ථාපනය කර ඇති දිගු කිසිවක් අහිමි වේ.
විධාන රේඛාවේ සිට වැඩ කරන PostgreSQL හි සියලුම වගු අතහැර දැමිය හැක්කේ කෙසේද?
දත්ත සමුදාය අතහැර දැමීමට මට අවශ්ය නැත , සියලු වගු සහ ඒවායේ ඇති සියලුම දත්ත පමණි.
public
, ඔබට ස්ථාපනය කර ඇති දිගු කිසිවක් අහිමි වේ.
Answers:
ඔබගේ සියලු වගු තනි යෝජනා ක්රමයක තිබේ නම්, මෙම ප්රවේශය ක්රියාත්මක විය හැකිය (පහත කේතයට අනුව ඔබගේ යෝජනා ක්රමයේ නම යැයි උපකල්පනය කරයි 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;
pg_
ඔවුන් වෙනස් ක්රමානුරූපය සිටින ලෙස), pg_catalog
.
GRANT ALL ON SCHEMA public TO public;
නිර්මාණය කිරීමෙන් පසු ඔබට අවශ්ය වෙනත් පිළිතුරකින් ගෙන ඒම .
GRANT ALL
නිර්මාණය කිරීමෙන් පසු ඔබට අවශ්ය ඇයි ?
මේ වගේ 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 ද ක්රියාත්මක වේ.
drop schema public cascade;
, නමුත් ඔබට සෑම විටම පාහේ වගු අතහැර දැමීමට අවසර ඇත.
මෙම ලිවීමේදී වඩාත්ම පිළිගත් පිළිතුර (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';
මා හට කලින් ඇති වූ ගැටළු භාවිතා කරමින් දත්ත සමුදා වගු (වෙබ් 2 පීපී) නිර්මාණය කරන පයිතන් වෙබ් රාමුවක් භාවිතා කිරීම:
<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;
drop
එවකට create
). 9.3 දක්වා උත්ශ්රේණිගත කිරීමෙන් පසුව, අමතර දෙක grant
අවශ්ය වේ.
ඔබට සියලු වගු අතහැර දැමිය හැකිය
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 නැවත පරිවර්තකයට පිටපත් කිරීම අවශ්ය නොවේ.
drop schema
පරිශීලකයා යෝජනා ක්රමයේ හිමිකරු නොවන නිසා මට උපක්රමය භාවිතා කළ නොහැකි විය, වගු පමණි. මෙය ක්රියාත්මක වුවද :)
EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
මේ සමඟ එම රේඛාව වෙනස් කිරීමට මම යෝජනා කරමි : EXECUTE format('DROP TABLE IF EXISTS %I CASCADE', quote_ident(r.tablename));
ඔබට අතහැර දැමීමට අවශ්ය සියල්ල එකම පරිශීලකයා සතු නම්, ඔබට මෙය භාවිතා කළ හැකිය:
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
public
යෝජනා ක්රමය අයත් වන්නේ postgres
, නමුත් අනෙක් සියල්ල නිශ්චිත පරිශීලකයෙකු සතු වන අතර, එම පරිශීලකයා සතු සියල්ල අතහැර දැමීම මඟින් ක්රමාංකය හැර දත්ත සමුදාය හිස් වේ.
ඉහත පැබ්ලෝට අනුව, නඩුව සම්බන්ධයෙන් නිශ්චිත යෝජනා ක්රමයකින් ඉවත් වීමට:
select 'drop table "' || tablename || '" cascade;'
from pg_tables where schemaname = 'public';
where schemaname='public'
කොටස වැදගත් යැයි මම සිතමි ?
drop schema public cascade;
උපක්රමය කළ යුතුයි.
CREATE SCHEMA public;
. වැඩි විස්තර සඳහා stackoverflow.com/a/14286370 ද බලන්න
පැබ්ලෝ සහ ලෙන්ඩබ්ලිව් අනුගමනය කරමින්, මෙන්න එක් ලයිනර් එකක් වන අතර ඒ සියල්ල සූදානම් කිරීම සහ ක්රියාත්මක කිරීම සිදු කරයි:
psql -U $PGUSER $PGDB -t -c "select 'drop table \"' || tablename || '\" cascade;' from pg_tables where schemaname = 'public'" | psql -U $PGUSER $PGDB
සැ.යු: කට්ටලයක් හෝ වෙනුවට එක්කෝ $PGUSER
හා $PGDB
ඔබට අවශ්ය අගයන්
ඔබ සතුව 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 තැපැල් ලැයිස්තුවක් ඇති අයෙකුගෙන් යැයි සිතන්න. කවදා හෝ කුමන එකක්දැයි හරියටම මතක නැත.
ඔබට කෙසේ හෝ සියලු වගු නිරුවත් කිරීමට අවශ්ය නම්, සියලු වගු තනි ප්රකාශයකට ඇතුළත් කිරීමෙන් ඔබට කැස්කැඩ් වැනි ලස්සන දේවල් සමඟ බෙදා හැරිය හැකිය. මෙය ක්රියාත්මක කිරීම ඉක්මන් කරයි.
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
අදාළ ලෙස.
public
ක්රමාංකය මත ක්රියාත්මක නොවන විට , ප්රකාශනයේ ක්රමානුරූප නාමය ඇතුළත් කිරීමට අමතක නොකරන්න: string_agg(quote_ident(schemaname) || '.' || quote_ident(tablename), ', ')
හුදෙක් වගු නම් පසු කිරීම වෙනුවට.
පහත දැක්වෙන පියවර ප්රයෝජනවත් විය හැකිය (ලිනක්ස් භාවිතා කරන්නන් සඳහා):
මුලදී postgres
පහත දැක්වෙන විධානය මඟින් විධාන විමසුම ඇතුළත් කරන්න :
sudo -u postgres psql
මෙම විධානය මඟින් දත්ත සමුදාය ඇතුළත් කරන්න (මගේ දත්ත සමුදායේ නම :) maoss
:
\c maoss
දැන් සියලු වගු අතහැර දැමීම සඳහා විධානය ඇතුළත් කරන්න:
DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
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; $$
මෙය සැබවින්ම සිත්ගන්නාසුලු ප්රශ්නයක් වන අතර, ඔබ එය විවිධාකාරයෙන් සිදු කරනු ඇත. මෙය ඔබට ප්රයෝජනවත් වනු ඇතැයි මම බලාපොරොත්තු වෙමි.
- වර්තමාන යෝජනා ක්රමය අතහැර දමා ප්රතිනිර්මාණය කිරීමෙන්
මෙන්න, පොදුවේ, අපට 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
, ආදිය
- වගුවේ සිට සියලුම වගු නම් ලබා ගැනීමෙන්
pg_tables
.
PostgreSQL නම් කර ඇති සියළුම වගු එහි වාර්තා වගුවේ ගබඩා කරයි pg_table
.
SELECT
'DROP TABLE IF EXISTS "' || tablename || '" CASCADE;'
from
pg_tables WHERE schemaname = 'public';
ඔබට පෙනෙන පරිදි, උපවගන්තිය භාවිතා කිරීමෙන්, අපට සම්පූර්ණ වගු ක්රමයෙන් ඉවත් කළ හැකිය.
වාසි:
අනෙක් දත්ත ආයතන වැදගත් වන අතර, ඔබට යෝජනා ක්රමයෙන් වගු පමණක් මකා දැමීමට අවශ්ය වූ විට, මෙම ප්රවේශය ඔබට සැබවින්ම උපකාරී වනු ඇත.
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]
එය පිටපත් කිරීමෙන් පසු පයිතන් එය මත රඳා පවතින බැවින් ඉන්ඩෙන්ටරය නිවැරදි බවට වග බලා ගන්න.
කොමා වලින් වෙන් කරන ලද ලැයිස්තුවක් සෑදීමට ඔබට string_agg ශ්රිතය භාවිතා කළ හැකිය, එය DROP TABLE සඳහා පරිපූර්ණයි. බෑෂ් පිටපතකින්:
#!/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"
ඔබට දත්ත මකා දැමීමට අවශ්ය නම් (වගුව මකා නොදමන්න):
-- 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>';
සටහන: මගේ පිළිතුර ඇත්ත වශයෙන්ම වගු සහ අනෙකුත් දත්ත සමුදා වස්තු මකා දැමීමයි; වගු වල ඇති සියලුම දත්ත මකා දැමීම සඳහා , එනම් සියලු වගු කප්පාදු කිරීම සඳහා , එන්ඩ්රේ දෙකම මාසයකට පසුව ඒ හා සමානව හොඳින් ක්රියාත්මක කරන ලද (සෘජු ක්රියාත්මක කිරීමේ) ප්රකාශයක් ලබා දී ඇත.
ඔබ එය කළ හැකි නොවේ එහිදී නඩු සඳහා DROP SCHEMA public CASCADE;
, DROP OWNED BY current_user;
හෝ දෙයක්, මෙහි Stand-alone SQL විධානාවලි මම ගනුදෙනුව-ආරක්ෂිත වන, ලියා තියෙන්නේ (එනම් ඔබ අතර එය කළ හැකි BEGIN;
හා එක්කෝ ROLLBACK;
එය ඉවත් පරීක්ෂා කිරීමට හෝ COMMIT;
ඇත්තටම ඔප්පු කරන්න) සහ “සියල්ල” දත්ත සමුදා වස්තු පිරිසිදු කරයි… හොඳයි, අපගේ යෙදුම භාවිතා කරන දත්ත සමුදායේ භාවිතා කරන සියල්ලම හෝ මට බුද්ධිමත්ව එකතු කළ හැකිය, එනම්:
CHECK
,, UNIQUE
)VIEW
s (සාමාන්ය හෝ ද්රව්යමය)public
ඩීබී-අභ්යන්තර) යෝජනා ක්රම “අපට” අයත් වේ: “දත්ත සමුදා සුපර් යූසර් නොවේ” ලෙස ක්රියාත්මක වන විට ස්ක්රිප්ට් ප්රයෝජනවත් වේ; සුපිරි පරිශීලකයෙකුට සියළුම ක්රමෝපායන් අතහැර දැමිය හැකිය (ඇත්ත වශයෙන්ම වැදගත් ඒවා තවමත් පැහැදිලිවම බැහැර කර ඇත)අතහැර දමා නැත (සමහරක් හිතාමතා; සමහර ඒවා අපගේ ඩීබී හි ආදර්ශයක් නොතිබූ නිසා පමණි):
public
ක්රමානුරූපය (ඔවුන් දීර්ඝ-සපයන දේවල් සඳහා උදා:)ඔබට යථා තත්වයට පත් කිරීමට අවශ්ය ඩම්ප් එක නැවත යථා තත්ත්වයට පත් කිරීමට අවශ්ය දත්ත ගබඩාවට වඩා වෙනස් දත්ත සමුදා ක්රමලේඛ අනුවාදයක් (උදා: ඩේබියන් , ෆ්ලයිවේ හෝ ද්රවශීලතා / ඩීබී-මැනුල් සමඟ) මෙය සැබවින්ම ප්රයෝජනවත් වේ 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; $$;
PostgreSQL 9.6 ( ) හි පසුකාලීන එකතු කිරීම් හැර ( ක්ලෙමන්ට් ප්රෙවොස්ට්extensions
විසින් දායක කරන ලදි ) පරීක්ෂා කර ඇත. 9.6 සහ 12.2 යන දිනවල සමස්ථ ඉවත් කිරීම පරීක්ෂා කරන ලද අතර, ක්රියා පටිපාටිය ඉවත් කිරීම 12.2 ද පරීක්ෂා කර ඇත. දෝෂ නිවැරදි කිරීම් සහ වැඩි දියුණු කිරීම් සාදරයෙන් පිළිගනිමු!jessie-backports
DROP FUNCTION
අසමත් වන අතර අනෙක් අතට. මම ශ්රිත අංශය මේ සඳහා වෙනස් කළෙමි: AND pp.prokind ='f' -- Function
නැතහොත්AND pp.prokind ='p' -- Procedure
proisagg
≤ 10.x හි සමස්ථ ( prokind
) සහ ≥ 11 හි සමස්ථ හා ක්රියා පටිපාටි ( ) හැසිරවීමට අනුවර්තනය කළෙමි (ගතිකව පරීක්ෂා කර) දෙකම පරීක්ෂා කළෙමි the ඉඟියට ස්තූතියි.
ඔබට වගු සහ අනුපිළිවෙල අතහැර දැමිය යුතුය, මෙන්න මට වැඩ කළ දේ
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
වත්මන් දත්ත සමුදායේ ඇති සියලුම වගු විනාශ කිරීම සඳහා රේල්ස් සඳහා වේගවත් කාර්යය
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
rake db:create
, මම එය ධාවනය කරමි. ඔබ ස්ටීව් තොරතුරක් කරන්න සහ කේතය ඉවත් කළ හැක table_name =
වෙනස් ", "
කිරීම සඳහා ","
සහ #{ tables }
දැමිමේ#{tables}
මම ජේමි වෙතින් බැෂ් ක්රමවේදය වැඩි දියුණු කළේ අදහස් ගැන සැලකිලිමත් වීමෙනි.
පහත දැක්වෙන bash කේතය පළමුව දර්ශන මකා දමයි
#!/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"
psql -d $PGDB -t --command "SELECT string_agg(sequence_name, ',') FROM information_schema.sequences WHERE sequence_schema='public' AND sequence_catalog='$PGDB'"
හොඳයි, මම විධාන රේඛාවෙන් වැඩ කිරීමට කැමති නිසා ...
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
a උපසර්ගය drop table
සහ උපසර්ගය සඳහා භාවිතා කරයි;
විධාන බෙදුම්කරු භාවිතා කරයි.
| egrep '_d_'
- එය grep
තවත් කිහිපයකට පයිප්ප කරන්න, ඔබ කුමන වගු අතහැර දමන්නේද යන්න පිළිබඳව ඔබට වඩාත් තෝරා බේරා ගත හැකිය.
drop table if exists _d_psidxddlparm;
drop table if exists _d_psindexdefn;
සටහන: ලියා ඇති පරිදි, මෙය \dt
තීරු ශීර්ෂයන්හි විධාන ප්රතිදානය සඳහා ව්යාජ පේළි සහ අවසානයේ සම්පූර්ණ පේළි ජනනය කරනු ඇත . මම grepping විසින් එය වැලැක්වීමට, එහෙත් ඔබ භාවිතා කළ හැකි head
හා tail
.
පහසුම ක්රමය නම්, පෙර පිළිතුරු වල අනෙක් අය යෝජනා කර ඇති පරිදි පොදු යෝජනා ක්රමය අතහැර දැමීමයි. කෙසේ වෙතත්, මෙය හොඳ ක්රමයක් නොවේ. එතැන් සිට අමතක වී ඇති ලේඛනගත නොවූ පොදු ක්රමයට කුමක් කර ඇත්දැයි ඔබ දන්නේ නැත. මෙය අනාගතයේදීත් එසේම වේවිදැයි ඔබ දන්නේ නැත. V9 හි එය හොඳ වනු ඇත, නමුත් V10 හි ඔබගේ සියලු පරිශීලකයින්ට යෝජනා ක්රමයට ප්රවේශය අහිමි වනු ඇති අතර නැවත ප්රවේශය ලබා දිය යුතුය. එසේ නොවුවහොත් ඔබේ යෙදුම බිඳී යනු ඇත. මම V11 පරික්ෂා කර නැත, නමුත් කාරණය වන්නේ ඔබ යන්ත්රයෙන් යන්ත්රයට, වෙබ් අඩවියට වෙබ් අඩවියට හෝ අනුවාදයට අනුවාදයට යන විට බිඳ වැටෙන්නේ කුමක් දැයි ඔබ නොදැන සිටීමයි. ඔබ දත්ත සමුදායට ප්රවේශය ඇති පරිශීලකයෙක් නම් එය කළ නොහැක.
ඔබට මෙය ක්රමලේඛිකව කිරීමට අවශ්ය නම් ඉහත සඳහන් වෙනත් පිළිතුරු මෙය ආවරණය කරයි, නමුත් ඉහත පිළිතුරු නොසලකන එක් දෙයක් නම් ඔබ වෙනුවෙන් වැඩ කිරීමට පෝස්ට්ග්රෙස් ලබා ගැනීමයි. පහත දැක්වෙන පරිදි -c විකල්පය සමඟ ඔබ pg_dump භාවිතා කරන්නේ නම්:
sudo su postgres -c "pg_dump -U postgres WhateverDB -c -f "/home/Anyone/DBBackupWhateverDB-ServerUnscheduled.sql""
එමඟින් සියලු වගු මකා දැමිය හැකි SQL ප්රකාශ සමඟ DB ප්රතිස්ථාපන ස්ක්රිප්ටයක් නිර්මාණය වේ.
ප්රශ්නය ඇසීමේ එකම අරමුණ ප්රතිෂ් restore ාපනය කිරීමට පෙර වගු මකා දැමීම නම්, ඔබේ ප්රතිෂ් restore ාපනය ඔබ වෙනුවෙන් වැඩ කරනු ඇත.
කෙසේ වෙතත්, ඔබට එය වෙනත් දෙයක් සඳහා අවශ්ය නම්, ඔබට SQL පිටපතෙන් බිංදු ප්රකාශ පිටපත් කළ හැකිය.