Tout d'abord, ne le faites pas sur votre base de données de production.
La bonne façon (tm) est d'utiliser les transactions pour ce qu'elles valent. Dans postgres, vous pouvez même les imbriquer en utilisant des points de sauvegarde (que vous pouvez faire une restauration).
test=# create table foo (foo_id serial primary key, bar varchar);
NOTICE: CREATE TABLE will create implicit sequence "foo_foo_id_seq" for serial column "foo.foo_id"
NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index "foo_pkey" for table "foo"
CREATE TABLE
test=# begin; insert into foo (bar) values ('test');
BEGIN
INSERT 0 1
test=# savepoint sp1;
SAVEPOINT
test=# insert into foo (foo_id, bar) values (1, 'test');
ERROR: duplicate key value violates unique constraint "foo_pkey"
test=# rollback to sp1;
ROLLBACK
test=# select * from foo;
foo_id | bar
--------+------
1 | test
test=# -- note that you're still in a transaction
Si cela ne convient pas (en raison de contraintes de logiciels ou d'autres raisons), vous pouvez toujours garder plusieurs décharges de votre base de données dans les fichiers que vous pouvez facilement restaurer; et/ou avoir un script qui sauvegarde automatiquement votre base de données de production dans une base de données de test locale. En outre, n'oubliez pas de garder vos changements de schéma dans le contrôle de version (ou un minimum de quelques fichiers .sql); facilite la mise à jour de votre base de données de production après avoir développé quelque chose de nouveau en utilisant votre base de données de test. PITR est principalement destiné à des fins de secours/sauvegarde à chaud.
C'est ce que je voulais, mais peut-être pas ce dont j'ai besoin, parce que mon application utilise Hibernate pour se connecter à la base de données. Merci. – Danmaxis