Imagina que administras una base de datos de millones de datos.
Un update a un campo te puede dañar toda la información sin posibilidad de recuperarla. Para hacer cambios a la base de datos se debe ser muy cuidadoso y tener las herramientas para recuperarse de posibles daños.
Lo que dices es exactamente lo que es.
begin; Es el inicio de una transacción. Con solo poner esta clausula es posible recuperar errores que puedas sufrir.
savepoint; Con esta sentencia haces un commit hasta el punto que estes seguro no tienes errores. La diferencia con commit es que no se finaliza la transacción.
rollback; Deshace todos los cambios que se hayan realizado desde la sentencia
begin. o hasta donde hayas confirmado con
savepoint. commit; Confirma y termina la transacción con los cambios establecidos.
Con un ejemplo:
Código sql:
Ver originalpruebas=> SELECT *FROM producto;
id | descr
----+-------------
1 | hoja
2 | hoja carta
3 | hoja oficio
4 | lapicero
(4 filas)
pruebas=> BEGIN;
BEGIN
pruebas=> UPDATE producto SET descr=REPLACE(descr,'hoja','papel');
UPDATE 4
pruebas=> SELECT *FROM producto;
id | descr
----+--------------
1 | papel
2 | papel carta
3 | papel oficio
4 | lapicero
(4 filas)
Hemos cambiado la palabra hoja por papel. Todo anda muy bien. Entonces vamos a confirmar hasta este punto que todo va bien haciendo uso de savepint.
Código sql:
Ver originalpruebas=> SAVEPOINT a;
SAVEPOINT
pruebas=> UPDATE producto SET descr=REPLACE(descr,'lapicero','boligrafo');
UPDATE 4
pruebas=> SELECT *FROM producto;
id | descr
----+--------------
1 | papel
2 | papel carta
3 | papel oficio
4 | boligrafo
(4 filas)
Mierda!!! no era bolígrafo sino pluma. Debemos deshacer todos los cambios!!!. Pero si ya tenia todo bueno hasta aca y no quiero volver a empezar.
Utilizamos savepoint para deshacer los cambios hasta ese punto.
Código sql:
Ver originalpruebas=> ROLLBACK TO a;
ROLLBACK
pruebas=> SELECT *FROM producto;
id | descr
----+--------------
1 | papel
2 | papel carta
3 | papel oficio
4 | lapicero
(4 filas)
Mira que el cambio de hoja a papel se conserva y solo se recupera la palabra lapicero.
Corregimos el error.
Código sql:
Ver originalpruebas=> UPDATE producto SET descr=REPLACE(descr,'lapicero','pluma');
UPDATE 4
ahora todo está bien. Solo nos queda confirmar la terminación de la transacción y terminarla.
Código sql:
Ver originalpruebas=> commit;
COMMIT
pruebas=> SELECT *FROM producto;
id | descr
----+--------------
1 | papel
2 | papel carta
3 | papel oficio
4 | pluma
(4 filas)
con respecto a tu pregunta:
Cita: hay una funcion que se llama SAVEPOINT me imagino que es "guardar punto", esto hay que colocarlo cada vez que se hace una consulta, actualizacion, o inserccion, por que aca solo lo muestra en un solo lado, ahh y tambien hay que colocar el rollback la cantidad de veces que ponemos los savepoint??
No es necesario. Cada sentencia se usa deacuerdo a las necesidades que tengas.
Si no tienes errores, solo es necesario el
begin y el
commit