2012-02-14 9 views
10

Necesito cambiar el nombre de una tabla en Oracle, pero quiero estar seguro de que las claves, restricciones, desencadenantes y secuencias externas que hacen referencia a la tabla se actualicen para usar el nuevo nombre.¿Cómo cambio el nombre de una tabla en Oracle para que se actualicen todas las claves, restricciones, desencadenantes y secuencias externas y se conserve la información existente?

¿Cómo puedo estar seguro de que no he roto nada?

Tenga en cuenta que deseo conservar los datos existentes que contiene la tabla.

Respuesta

12

Depende de lo que quiere decir con "cualquier clave externa, restricciones, activadores y secuencias que hacen referencia a la tabla se actualizan para usar el nuevo nombre".

Cualquier índice existente, restricciones y activadores en la tabla que se está renombrando hará referencia automáticamente al nuevo nombre.

Sin embargo, las convenciones de nomenclatura utilizadas para esos objetos no utilizarán automáticamente el nombre actualizado. Por ejemplo, si la clave principal para TABLE_NAME generalmente se llama TABLE_NAME_PK, el cambio de nombre de TABLE_NAME a NEW_TABLE_NAME no cambiará automáticamente el nombre de la restricción de clave principal a NEW_TABLE_NAME_PK.

Lo que se debe comprobar es el código (paquetes, procedimientos y funciones) que hacía referencia al nombre de la tabla anterior, así como a cualquier desencadenante que hiciera referencia al nombre de la tabla anterior. Del mismo modo, las vistas en contra del nombre de la tabla anterior también se romperán. La vista ALL_DEPENDENCIES puede ayudar a identificar cuáles de esos objetos necesitan ser actualizados.

+0

Gracias Adam. @Justin sugirió que los disparadores continuarán funcionando correctamente. ¿Estás diciendo que necesitaré corregir manualmente los disparadores? Por ejemplo, si tuviera un disparador de autoincrement (CREATE TRIGGER trg_bi_foo ANTES DE INSERTAR foo PARA CADA FILA INICIE SELECCIONAR seq_foo.NEXTVAL IN: NEW.foo_id FROM DUAL; END;) se actualizará automáticamente "ANTES DE INSERTAR EN foo" a "ANTES INSERTAR en la barra "? –

+3

Sí.Pero si tiene algún otro disparador en alguna otra tabla que realiza una consulta en contra de 'foo', ese disparador no se actualizará automáticamente para consultar contra' bar'. –

18

Si usted

ALTER TABLE old_table_name 
RENAME TO new_table_name; 

todas las restricciones existentes (clave externa y de las limitaciones) y disparadores hará referencia al objeto recién cambiado de nombre. Las secuencias no tienen relación con las tablas, por lo que no habrá impacto en las secuencias (aunque si quiere decir que está haciendo referencia a la secuencia en un desencadenante de la tabla, el desencadenador seguirá haciendo referencia a la misma secuencia después del cambio de nombre). Sin embargo, será necesario actualizar todos los procedimientos almacenados que haya escrito que hagan referencia al nombre de la tabla anterior para hacer referencia al nuevo nombre de la tabla.

Ahora, aunque las restricciones y disparadores continuarán funcionando correctamente, conservarán sus nombres originales. Si tiene convenciones de nomenclatura para estos objetos que desea mantener después del nombre de la tabla, deberá hacer más. Por ejemplo, si quieres un nivel de fila antes de desencadenador de inserción en la tabla FOO a ser nombrado TRG_BI_FOO y cambiar el nombre de la tabla a BAR, que había necesidad de alterar el gatillo de forma explícita a cambiar su nombre

ALTER TRIGGER trg_bi_foo 
    RENAME TO trg_bi_bar; 

Del mismo modo, que había necesidad de cambiar el nombre de sus limitaciones e índices

ALTER TABLE bar 
    RENAME CONSTRAINT pk_foo TO pk_bar; 
1
ALTER TABLE oldName RENAME TO newName 

preservará dependencias y datos de la tabla, pero no siempre puede ser una pieza de PL/SQL que hace referencia al antiguo nombre que se va a perder su validez.

Cuestiones relacionadas