I Postgres kan du göra mycket med transaktioner som återställs i slutet:
BEGIN;
UPDATE foo ...:
INSERT bar ...;
SELECT baz FROM ...;
CREATE TABLE abc...; -- even works for DDL statements
DROP TABLE def...;
ALTER TABLE ghi ...:
ROLLBACK; -- !
Var medveten om att vissa saker inte kan rullas tillbaka. Till exempel rullar sekvenser inte tillbaka. Eller några speciella kommandon som dblink samtal.
Och vissa kommandon kan inte köras i en transaktion med andra. Som CREATE DATABASE
eller VACUUM
.
Det kan också finnas biverkningar med samtidig belastning, som dödläge. Osannolikt dock. Du kan ställa in transaktionsisoleringsnivån till dina krav för att utesluta eventuella biverkningar (till viss kostnad för prestanda).
Jag skulle inte göra det här med vettig data. Risken att begå av misstag är för stor. Och att låta användare exekvera godtycklig kod är en risk som knappast går att hantera. Men för en träningsmiljö borde det vara tillräckligt bra.
Säkerhetskopiera den med en malldatabas . Om något skulle gå fel är det det snabbaste sättet att återställa ett grundläggande tillstånd. Exempel (titta på det sista kapitlet):
Trunkera alla tabeller i en Postgres-databas
Detta kan också användas som brute force alternativ :att tillhandahålla en ren ny databas för varje praktikant.