Commit y Rollback en BD Oracle

alex_xp

Gold Member
Se incorporó
12 Octubre 2004
Mensajes
2.572
Estimados,

Tengo una duda con un desarrollo en una base de datos Oracle.

Resulta que debo hace unos scripts que realizan cambios en una tabla, (le van a agregar más columnas y modificar el largo del varchar) esta base de datos esta en un ambiente de desarrollo por lo cual si realizo los cambios después debo volver atrás. Esto mismo también lo debo realizar para unos SP que realizan consultas a dicha tabla.
Mi pregunta es como puedo realizar un rollback de los cambios que voy a hacer?
Debo de hacer el commit cuando ejecute los cambios?

Saludos
 

unreal4u

I solve problems.
Miembro del Equipo
ADMIN
Se incorporó
2 Octubre 2005
Mensajes
13.464
Un rollback sólo sirve en el contexto de transacciones: si todo sale bien, haces un commit, si este commit tiene alguna parte errónea, ejecutas el rollback.

Lo que tú necesitas es una migración, que son simplemente el reverso de lo que hiciste, efectivamente creando lo opuesto.

Debo aclarar eso sí que no soi un experto en Oracle, pero la terminología debería ser igual en cualquier RDBMS.

Saludos.
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.752
Alex, si ejecutas un conjunto de operaciones insert/update/delete estás no se "graban" permanente hasta que haces un commit.
Si haces un commit, esas operaciones se graban permanente el rollback no te servirá de nada.

Si ejecutas ese conjunto de operaciones y se te corta la comunicación entre tu cliente sql (toad, tu aplicación, sqlplus), la base de datos automáticamente hará un rollback y deshará las operaciones.

Si ejecutas ese conjunto de operaciones y decides hacer un rollback pasa lo mismo: se deshacen las operaciones.

Dato: las operaciones que alteran la estructura de una tabla (crear o borrar una columna) llevan un commit implícito así que cuidado con eso.




Enviado desde mi Redmi Note 5A Prime mediante Tapatalk
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.752
Para terminar:
Si lo que vas a hacer es modificar la estructura de la tabla el rollback no aplica. La única forma de deshacer el cambio es restaurar manualmente la tabla a partir de un respaldo de la base de datos o de una copia de la tabla. Creo que sí la base de datos es entreprise edition puedes usar las funcionalidades de flashback propias de Oracle (en tu cara sql server y postgres).

Que haría yo:
Si la tabla no es muy grande, hago una copias.
Create table paso_alex as
Select * from alex.

Luego hago el despliegue sobre la tabla Alex (ponle que le dropeo una columna).

Si algo falla tengo todos los datos iniciales en la tabla paso_alex.

Alex, si se te viene un despliegue y tienes dudas mándame un mp para ayudarte por wasap. Si no estás tan urgido veámoslo por acá en el foro.

Enviado desde mi Redmi Note 5A Prime mediante Tapatalk
 
Upvote 0

alex_xp

Gold Member
Se incorporó
12 Octubre 2004
Mensajes
2.572
Gracias por las respuestas @Zuljin y no estoy tan urgido y no voy a hacer un despliegue por lo menos no por ahora, mañana dentro del día voy a exponer con más detalles el caso. Lamentablemente como no soy muy perito en base de datos igualmente me mandan a hacer ese tipo de cosas, lo único bueno es que con eso voy aprendiendo.

Saludos y se agradece nuevamente.
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.752
Igual si te es posible cuenta más. Lo importante:

Los alter table, drop column y cosas como esa llevan un commit implícito. Tirar un rollback manual no va a servir.
 
Upvote 0

alex_xp

Gold Member
Se incorporó
12 Octubre 2004
Mensajes
2.572
La situación es la siguiente.

Existe en una base de datos, que es de desarrollo, una tabla con registros a la cual se le deben agregar 8 columnas más y modificar una columna el largo del varchar ergo modificar los packege que contienen los sp que realizan consultas a la tabla (Select, Insert, Update).
Al ser una base de datos de desarrollo hay más gente que lo utiliza para pruebas y demás cosas , me dijeron que si hago pruebas de modificar la tabla debo realizar el rollback y de hay me surgieron las siguientes dudas:

Si hago el ALTER TABLE para agregar más campos, después como hago la vuelta atrás?
Creo que esto ya me lo habías respondido más arriba.

Al agregar más columnas a la tabla que pasan con los registros antiguos, me refiero que estos no ne van a actualizar y solo los registros nuevos irán a tener datos en los campos nuevos?

Saludos
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.752
Si hago el ALTER TABLE para agregar más campos, después como hago la vuelta atrás?
Creo que esto ya me lo habías respondido más arriba.

Si haces un ALTER TABLE para agregar campos, la vuelta atrás es borrar esas columnas

https://oracle-base.com/articles/8i/dropping-columns

Código:
ALTER TABLE tabla_alex DROP (COLUMNA1, COLUMNA2, COLUMNA3)

No requiere commit pues lleva un commit implícito.
Ojo que si la tabla es grande la operación se va a demorar bastante.


Al agregar más columnas a la tabla que pasan con los registros antiguos, me refiero que estos no ne van a actualizar y solo los registros nuevos irán a tener datos en los campos nuevos?

Saludos

Si quieres puedes indicarle a la instrucción que le agregue un valor por defecto a la columna nueva

Código:
ALTER TABLE tabla_alex  ADD (COLUMNA1  VARCHAR2(20)                          DEFAULT 'HOLI')

En el ejemplo, si la tabla tenía originalmente mil registros y le agregas la COLUMNA1 con valor por default 'HOLI', el valor de la COLUMNA1 en los mil registros antiguos será 'HOLI'. Si no le dices nada la nueva columna se creará sin datos.
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.752
Dato a considerar:

Es una mala práctica en programación tener código que haga ZELECT con *. Así

Código:
ZELECT* FROM tabla_alex

¿Por qué es mala práctica? Porque si le agregas columnas, ese ZELECT * FROM tabla_alex va a traer más valores que los que esperaba la aplicación Y SE VA A CAER. Lo correcto es que los ZELECT indiquen explícitamente los campos deseados

Código:
ZELECT COLUMNA1, COLUMNA2, COLUMNA3 FROM tabla_alex

así, si luego agregas la COLUMNA4 a la aplicación le da lo mismo, ni se entera. Lo mismo que si después borras la COLUMNA4.
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.752
Puse los ZELECT con z para que el foro me deje publicar.
 
Upvote 0
Subir