Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Cambiar tipo de dato a una columna en BD en produccion.

Estas en el tema de Cambiar tipo de dato a una columna en BD en produccion. en el foro de Oracle en Foros del Web. Hola foristas. Tengo este reto/compromiso, cambiar una columna de numeric a varchar en TODA la base de datos. El porque es un cuento largo pero ...
  #1 (permalink)  
Antiguo 27/07/2010, 17:15
Avatar de Hollman  
Fecha de Ingreso: enero-2003
Ubicación: Bogotá - Colombia
Mensajes: 202
Antigüedad: 21 años, 9 meses
Puntos: 1
Exclamación Cambiar tipo de dato a una columna en BD en produccion.

Hola foristas.

Tengo este reto/compromiso, cambiar una columna de numeric a varchar en TODA la base de datos. El porque es un cuento largo pero tengo que cambiarla.

Como haria ese cambio? Será que haciendo un export de la estructura y datos por separado, restaurándo la estructura en otro usuario/bd, desabilitando los constraints, cambiando el tipo de dato para la columna en cuestion en todas las tablas, habilitando nuevamente los constraints y restaurando los datos en el nuevo usuario/bd FUNCIONARIA ?

De cual otra forma podría hacerse?

Uds que me dicen.. .realmente no se mucho de Oracle por eso acudo a vuestra conocimeinto y experiencia.
  #2 (permalink)  
Antiguo 28/07/2010, 11:08
 
Fecha de Ingreso: julio-2010
Ubicación: Madrid
Mensajes: 6
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: Cambiar tipo de dato a una columna en BD en produccion.

Buenas, la forma más sencilla es utilizar el estamento Alter Table ...., los pasos a seguir son,

1.- Backup de BBDD, en este cso tre recomiendo un export.
2.- Hacer esta operación sin usuarios.
3.- Asegurante que tanto el undo este dimensionado correctamente.
4.- ejecutar el alter..

ALTER TABLE nombre_tabla
MODIFY nombre_columna tipo_columna;

En tu caso quieres pasar de numerico a char,

ALTER TABLE Prueba
MODIFY edad varchar2(10);

Saludos
  #3 (permalink)  
Antiguo 28/07/2010, 13:18
Avatar de Hollman  
Fecha de Ingreso: enero-2003
Ubicación: Bogotá - Colombia
Mensajes: 202
Antigüedad: 21 años, 9 meses
Puntos: 1
Respuesta: Cambiar tipo de dato a una columna en BD en produccion.

Hola lrodrig69

Muchas gracias por responder.

Intente eso antes..... me muestra un mensaje que dicha columna debe esta vacia para cambiar el tipo de dato. Como la BD esta en produccion ...mmm cambia un poco la situacion... por eso suspuse que lo que habia que hacer es lo que coloque en la descripcion del tema.
  #4 (permalink)  
Antiguo 29/07/2010, 04:49
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 4 meses
Puntos: 43
Respuesta: Cambiar tipo de dato a una columna en BD en produccion.

Aunque el proceso es muy sencillo, vas a tener que hacerlo en horas " intempestivas", vamos, cuando no esté trabajando nadie.

Esto es lo que debes hacer.

1-) Create un campo " Dummy " tipo varchar2 en la tabla.
2-) Haz un update de ese campo con el contenido del campo numeric que quieres cambiar a varchar
3-) Updatea el campo numeric y ponlo a null
4-) Cambia el campo numeric a varchar2
5-) Updatea el campo varchar2 ( antes numeric ) con el contenido del campo " Dummy "
6-) Dropea el campo " dummy " .

Esto una vez por cada campo que quieres cambiar el tipo de dato, puedes hacerlo con un simple script sql, pero dado que lo haces en produccion, mejor que lo hagas paso por paso.

NOTA : Si las tablas tienen triggers que salten con el update, deshabiltalos ( Te lo digo por experiencia ) y recompila todos los pl's que se te queden descompilados.

No creo que te queden dudas, pero si se dá el caso, pregunta.
  #5 (permalink)  
Antiguo 30/07/2010, 08:26
Avatar de Hollman  
Fecha de Ingreso: enero-2003
Ubicación: Bogotá - Colombia
Mensajes: 202
Antigüedad: 21 años, 9 meses
Puntos: 1
Respuesta: Cambiar tipo de dato a una columna en BD en produccion.

Hola jc3000

Segui las indicaciones y funciona hasta el punto de encontrar el pk del cual se realizan la mayoria de las fk. me lanza el error ORA-12992 cannot drop parent key column.

Ahi seria recorrer all_constraint y all_cols_constraint antes todo para rehacer el pk y las fk despues de borrar el pk con constraint cascade. Cierto?
  #6 (permalink)  
Antiguo 30/07/2010, 09:10
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 4 meses
Puntos: 43
Respuesta: Cambiar tipo de dato a una columna en BD en produccion.

Jodio, eso no lo has dicho.

Si tienes una tabla que la columna que tienes que cambiar es PK, vas a tener un problema, no solamente tienes que cambiar el tipo de dato del campo de la PK, sino que también de todas las FK que tiren de esa PK, porque la PK de la tabla padre es varchar2 , los hijos de esa tabla tienen que ser tambien varchar2. Y si esas FK's forman a su vez parte de la PK, tienes que hacer lo mismo con sus hijos y así hasta el final

Ah, y NI SE TE OCURRA hacer lo de cascade bla, bla, bla, porque dejas las tablas niqueladas.

Así que agrosso modo tendrías que hacer esto :

0-) Borra todas las PK de las tablas implicadas y las FK's que tiren de ellas
1-) Create un campo " Dummy " tipo varchar2 en la tabla.
2-) Haz un update de ese campo con el contenido del campo numeric que quieres cambiar a varchar
3-) Updatea el campo numeric y ponlo a null
4-) Cambia el campo numeric a varchar2
5-) Updatea el campo varchar2 ( antes numeric ) con el contenido del campo " Dummy "
6-) Dropea el campo " dummy " .
7-) Crea de nuevo las PK's y las FK's.

Como sean muchas tablas lo llevas jodido.
  #7 (permalink)  
Antiguo 31/07/2010, 19:28
Avatar de Hollman  
Fecha de Ingreso: enero-2003
Ubicación: Bogotá - Colombia
Mensajes: 202
Antigüedad: 21 años, 9 meses
Puntos: 1
Respuesta: Cambiar tipo de dato a una columna en BD en produccion.

Hola JC3000

En el listado de tus acciones recomendadas en el item cero esta el borrar el pk con todas las fk relacionadas. Eso fue lo que te dije antes y me respondiste que me olvidara de eso ... pensaba hacer un alter table TABLA drop constraint LLAVE_PK cascade despues de haber guardado todas las fk relacionadas en una nested table.
Continuo con tus recomendaciones y por ultimo en la re-creacion de las fk ejecuto lo guardado en la nested table.

Ahorita estoy probando eso...
  #8 (permalink)  
Antiguo 01/08/2010, 12:32
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 4 meses
Puntos: 43
Respuesta: Cambiar tipo de dato a una columna en BD en produccion.

No, tienes que borrar las FK's y las Pk's y luego crearlas.

Si haces los de CASCADE borras los datos y te complicas la vida.

Haz DROP FK'S y DROP PK y luego crealas.
  #9 (permalink)  
Antiguo 05/08/2010, 14:06
Avatar de Hollman  
Fecha de Ingreso: enero-2003
Ubicación: Bogotá - Colombia
Mensajes: 202
Antigüedad: 21 años, 9 meses
Puntos: 1
Respuesta: Cambiar tipo de dato a una columna en BD en produccion.

Hola jc3000 y demas lectores.

ya culmine el paquete que hace la migracion. Adicional a lo sugerido por jc3000 tuve que adicionar las restricciones de not null (check) e index (incluyendo unique).

Muchas gracias y muchos exitos.

Etiquetas: bd, columna, dato, tipo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:01.