Jak mogę upuścić wszystkie tabele w PostgreSQL, pracując z wiersza poleceń?
I nie chcą spadać samej bazy danych, tylko wszystkie tabele i wszystkie dane w nich.
postgresql
AP257
źródło
źródło
public
, stracisz wszystkie zainstalowane rozszerzenia.Odpowiedzi:
Jeśli wszystkie tabele są w jednym schemacie, to podejście może działać (poniższy kod zakłada, że nazwa Twojego schematu to
public
)Jeśli używasz PostgreSQL w wersji 9.3 lub nowszej, może być konieczne przywrócenie domyślnych dotacji.
źródło
pg_
), ponieważ są one w innym schemaciepg_catalog
.GRANT ALL ON SCHEMA public TO public;
po utworzeniu.GRANT ALL
po utworzeniu?Możesz napisać zapytanie, aby wygenerować skrypt SQL w następujący sposób:
Lub:
W przypadku, gdy niektóre tabele są automatycznie usuwane z powodu opcji kaskadowej w poprzednim zdaniu.
Ponadto, jak stwierdzono w komentarzach, możesz filtrować tabele, które chcesz upuścić według nazwy schematu:
A potem uruchom.
Chwalebna KOPIA + WKLEJ również będzie działać.
źródło
drop schema public cascade;
, ale prawie zawsze masz uprawnienia do usuwania tabel.Najbardziej akceptowaną odpowiedzią na ten tekst (styczeń 2014) jest:
Działa to, jednak jeśli Twoim celem jest przywrócenie schematu publicznego do stanu pierwotnego, nie jest to w pełni możliwe. W pgAdmin III dla PostgreSQL 9.3.1 kliknięcie utworzonego w ten sposób schematu „publicznego” i spojrzenie w „okienku SQL” spowoduje wyświetlenie następujących informacji:
Natomiast dla zupełnie nowej bazy danych będą:
Dla mnie za pomocą frameworka sieci web Python, który tworzy tabele bazy danych (web2py), użycie tego pierwszego spowodowało problemy:
Moim zdaniem w pełni poprawna odpowiedź brzmi:
Pamiętaj też, aby wydać te polecenia w pgAdmin III, użyłem narzędzia Query (ikona lupy „Wykonaj abritrary SQL queries”) lub możesz użyć Plugins-> PSQL Console
Uwaga
Jeśli masz zainstalowane jakieś rozszerzenia, zostaną one usunięte po upuszczeniu schematu, więc powinieneś zanotować, co potrzebujesz zainstalować, a następnie wykonać instrukcje w razie potrzeby. Na przykład
CREATE EXTENSION postgis;
źródło
drop
wówczascreate
) działało na PostgreSQL 9.1. Po aktualizacji do 9.3grant
konieczne są dwa dodatkowe .Możesz upuścić wszystkie tabele za pomocą
IMO jest to lepsze niż
drop schema public
, ponieważ nie trzeba odtwarzaćschema
i przywracać wszystkich dotacji.Dodatkowa premia za to, że nie wymaga zewnętrznego języka skryptowego ani wklejania kopii wygenerowanego SQL z powrotem do interpretera.
źródło
drop schema
sztuczki, ponieważ użytkownik nie był właścicielem schematu, tylko tabel. Ten zadziałał :)EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
w ten sposób:EXECUTE format('DROP TABLE IF EXISTS %I CASCADE', quote_ident(r.tablename));
Jeśli wszystko, co chcesz upuścić, jest własnością tego samego użytkownika, możesz użyć:
Spowoduje to usunięcie wszystkiego , co użytkownik jest właścicielem.
Obejmuje to zmaterializowane widoki, widoki, sekwencje, wyzwalacze, schematy, funkcje, typy, agregacje, operatory, domeny i tak dalej (tak naprawdę: wszystko ), do którego należy
the_user
(= utworzono).Musisz zastąpić
the_user
rzeczywistą nazwą użytkownika, obecnie nie ma opcji, aby porzucić wszystko dla „bieżącego użytkownika”. Nadchodząca wersja 9.5 będzie miała opcjędrop owned by current_user
.Więcej szczegółów w instrukcji: http://www.postgresql.org/docs/current/static/sql-drop-owned.html
źródło
public
schemat są własnościąpostgres
, ale wszystko inne jest własnością określonego użytkownika, więc usunięcie wszystkiego, co należy do tego użytkownika, usuwa bazę danych oprócz schematu.Zgodnie z Pablo powyżej, aby po prostu usunąć z określonego schematu, w odniesieniu do przypadku:
źródło
where schemaname='public'
część jest znacząca?powinien załatwić sprawę.
źródło
CREATE SCHEMA public;
. Zobacz także stackoverflow.com/a/14286370, aby uzyskać więcej informacjiPodążając za Pablo i LenW, oto jedna linijka, która robi wszystko, zarówno przygotowując, jak i wykonując:
psql -U $PGUSER $PGDB -t -c "select 'drop table \"' || tablename || '\" cascade;' from pg_tables where schemaname = 'public'" | psql -U $PGUSER $PGDB
Uwaga: ustaw lub zamień
$PGUSER
oraz$PGDB
z żądanymi wartościamiźródło
Jeśli masz zainstalowany język proceduralny PL / PGSQL , możesz użyć następującego polecenia, aby usunąć wszystko bez zewnętrznego skryptu powłoki / Perla.
Zamiast wpisywać to w wierszu polecenia „psql”, sugerowałbym skopiowanie go do pliku, a następnie przekazanie pliku jako danych wejściowych do psql przy użyciu opcji „--file” lub „-f”:
Kredyt tam, gdzie należy się kredyt: napisałem tę funkcję, ale myślę, że zapytania (lub przynajmniej pierwsze) pochodziły od kogoś z jednej z list mailingowych pgsql lata temu. Nie pamiętam dokładnie, kiedy i który z nich.
źródło
Jeśli i tak chcesz nuke wszystkie tabele, możesz zrezygnować z subtelności, takich jak CASCADE, umieszczając wszystkie tabele w jednym wyciągu. To także przyspiesza wykonanie.
Wykonując to bezpośrednio:
Wymień
TRUNCATE
sięDROP
stosownie.źródło
public
schemacie, nie zapomnij dołączyć nazwy schematu do wyrażenia:string_agg(quote_ident(schemaname) || '.' || quote_ident(tablename), ', ')
zamiast zwykłego przekazywania nazw tabel.Zmodyfikowałem nieco odpowiedź Pablo, aby dla wygody wygenerowane polecenia SQL były zwracane jako jeden ciąg:
źródło
Użyj tego skryptu w pgAdmin:
źródło
Na wszelki wypadek ... Prosty skrypt Pythona, który czyści bazę danych Postgresql
Upewnij się, że po skopiowaniu wcięcie jest prawidłowe, ponieważ Python na nim polega.
źródło
Możesz użyć funkcji string_agg, aby utworzyć listę oddzieloną przecinkami, idealną do TABELI KROPEK. Ze skryptu bash:
źródło
Jeśli chcesz usunąć dane (nie usuwać tabeli):
Lub jeśli chcesz drop table, możesz użyć tej sql:
źródło
Uwaga: moja odpowiedź dotyczy naprawdę usuwania tabel i innych obiektów bazy danych; do usuwania wszystkich danych w tabelach, czyli obcięcie wszystkich tabel , Endre Zarówno dostarczył Podobnie dobrze wykonane (bezpośrednia realizacja) oświadczenie miesiąc później.
Dla przypadków, w których nie możesz po prostu
DROP SCHEMA public CASCADE;
,DROP OWNED BY current_user;
lub coś, oto samodzielny skrypt SQL, który napisałem, który jest bezpieczny dla transakcji (tj. Możesz umieścić go pomiędzyBEGIN;
i alboROLLBACK;
po prostu przetestować, alboCOMMIT;
faktycznie zrobić czyn) i czyści „wszystkie” obiekty bazy danych… cóż, wszystkie te używane w bazie danych, z której korzysta nasza aplikacja, lub mógłbym rozsądnie dodać, czyli:CHECK
,UNIQUE
)VIEW
s (normalny lub zmaterializowany)public
lub wewnętrzne DB) „my” są właścicielami: skrypt jest użyteczny, gdy działa jako „nie superużytkownik bazy danych”; superużytkownikiem może spaść wszystkie schematy (to naprawdę ważne te są nadal wyraźnie wyłączone, chociaż)Nie spadła są (niektóre celowe, niektóre tylko dlatego, że nie miał przykładu w naszym DB):
public
schematu (np przesuwnych warunkiem rzeczy w nich)Jest to naprawdę przydatne w przypadkach, gdy zrzut, który chcesz przywrócić, ma inną wersję schematu bazy danych (np. Z Debianem
dbconfig-common
, Flyway lub Liquibase / DB-Manul) niż baza danych, w której chcesz go przywrócić.Mam też wersję, która usuwa „wszystko oprócz dwóch tabel i tego, co do nich należy” (sekwencja, przetestowana ręcznie, przepraszam, wiem, nudna) na wypadek, gdyby ktoś był zainteresowany; różnica jest niewielka. Skontaktuj się ze mną lub sprawdź to repozytorium, jeśli jesteś zainteresowany.
SQL
Testowane, z wyjątkiem późniejszych dodatków ( napisanych
extensions
przez Clément Prévost ), na PostgreSQL 9.6 (jessie-backports
). Usuwanie kruszywa testowane na 9.6 i 12.2, usuwanie procedury również testowane na 12.2. Mile widziane poprawki i dalsze ulepszenia!źródło
DROP FUNCTION
kończy się niepowodzeniem i na odwrót. Zmodyfikowałem sekcję funkcji do tego:AND pp.prokind ='f' -- Function
lubAND pp.prokind ='p' -- Procedure
proisagg
) na ≤ 10.x oraz agregatów i procedur (prokind
) na ≥ 11 (sprawdzane dynamicznie) i przetestowałem oba ☻ dzięki za podpowiedź.To naprawdę interesujące pytanie, a wykonasz je na wiele sposobów. Mam nadzieję, że ci się przyda.
Tutaj, ogólnie,
public
domyślnie mamy schemat. Używam tego jako instancji.Jeśli używasz PostgreSQL w wersji 9.3 lub nowszej, może być konieczne przywrócenie domyślnych dotacji.
Spowoduje to wyczyszczenie całego schematu i odtworzenie go jako nowego.
Stracisz też inne podmioty jak
Functions
,Views
,Materialized views
, itd.PostgreSQL przechowuje wszystkie tabele w tabeli rekordów o nazwie
pg_table
.Jak widać, za pomocą podzapytania możemy usunąć całe tabele ze schematu.
Gdy inne jednostki danych są ważne i chcesz po prostu usunąć tylko tabele ze schematu, takie podejście naprawdę ci się przyda.
źródło
Musisz upuścić tabele i sekwencje, oto co dla mnie zadziałało
przed uruchomieniem polecenia może trzeba sudo / su do
postgres
użytkownika lub (połączenie eksport szczegółówPGHOST
,PGPORT
,PGUSER
iPGPASSWORD
), a następnieexport PGDATABASE=yourdatabase
źródło
Zadanie rake dla Railsów w celu zniszczenia wszystkich tabel w bieżącej bazie danych
źródło
rake db:create
to uruchamiam Można zrobić końcówkę Steve i usunąć kodtable_name =
i zmiany", "
na","
i#{ tables }
fo#{tables}
Ulepszyłem metodę bash od jamie, dbając o widoki, ponieważ tylko szanuje on typ tabeli „tabela podstawowa”, która jest domyślna.
następujący kod bash usuwa najpierw widoki, a następnie całą resztę
źródło
psql -d $PGDB -t --command "SELECT string_agg(sequence_name, ',') FROM information_schema.sequences WHERE sequence_schema='public' AND sequence_catalog='$PGDB'"
w pliku wsadowym Windows:
źródło
Pomocne mogą być następujące kroki (dla użytkowników Linuksa):
Najpierw wpisz
postgres
wiersz polecenia, wykonując następujące polecenie:Wejdź do bazy danych za pomocą tego polecenia (moja nazwa bazy danych to
maoss
:):Teraz wpisz polecenie upuszczenia wszystkich tabel:
źródło
cóż, ponieważ lubię pracować z wiersza poleceń ...
psql -U <user> -d <mydb> -c '\dt' | cut -d ' ' -f 4 | sed -e "s/^/drop table if exists /" | sed -e "s/$/;/"
-c '\dt'
wywoła polecenie listy tabel.List of relations Schema | Name | Type | Owner --------+-------------------+-------+---------- public | _d_psidxddlparm | table | djuser public | _d_psindexdefn | table | djuser
cut -d ' ' -f 4
teraz potokuj wyjście, aby chwycić czwarte pole (gdy używasz spacji jako separatora), którym jest tabela.sed
jest następnie używany do prefiksu adrop table
i sufiksu;
separatora poleceń.| egrep '_d_'
- Pipe to dogrep
kilku więcej i możesz być bardziej selektywny, co do upuszczanych tabel.drop table if exists _d_psidxddlparm; drop table if exists _d_psindexdefn;
Uwaga: jak napisano, wygeneruje to fałszywe wiersze dla danych
\dt
wyjściowych poleceń nagłówków kolumn i sumy wierszy na końcu. Unikam tego przez grepowanie, ale możesz użyćhead
itail
.źródło
Najprostszym sposobem jest usunięcie schematu publicznego, jak sugerowali inni w poprzednich odpowiedziach. Jednak to NIE jest dobry sposób. Nigdy nie wiadomo, co zostało zrobione ze schematem publicznym, który został zapomniany i nie został udokumentowany. Nie wiesz też, czy to zadziała w przyszłości. W wersji V9 wszystko byłoby w porządku, ale w wersji 10 wszyscy użytkownicy straciliby dostęp do schematu i muszą uzyskać dostęp ponownie, w przeciwnym razie aplikacja się zepsuje. Nie sprawdziłem wersji V11, ale chodzi o to, że nigdy nie wiesz, co się zepsuje podczas przechodzenia od maszyny do maszyny, witryny do witryny lub wersji do wersji. Nie można tego również zrobić, jeśli użytkownik ma dostęp do bazy danych, ale nie do schematu.
Jeśli musisz to zrobić programowo, wówczas powyższe odpowiedzi obejmują inne odpowiedzi, ale jedną z powyższych odpowiedzi nie są rozważenia, aby zachęcić Postgres do wykonania pracy za Ciebie. Jeśli używasz pg_dump z opcją -c jak poniżej:
Spowoduje to utworzenie skryptu przywracania DB z instrukcjami SQL, które usuwają wszystkie tabele.
Jeśli jedynym celem zadania pytania było usunięcie tabel przed przywróceniem, wówczas przywrócenie wykona pracę za Ciebie.
Jeśli jednak potrzebujesz go do czegoś innego, możesz po prostu skopiować instrukcje drop ze skryptu sql.
źródło