Articles

Dos formas de cambiar el nombre de los objetos de base de datos de SQL Server

Posted on

De vez en cuando, puede ser necesario cambiar el nombre de un objeto de base de datos por diversas razones. Cuando eso ocurre, las funciones nativas para cambiar el nombre de los objetos de base de datos de SQL Server pueden ser muy útiles. Pero, hay grandes diferencias entre simplemente renombrar objetos de base de datos de SQL Server en el SQL Server Management Studio y renombrar de forma segura con ApexSQL Refactor.

Este artículo explicará las diferencias entre renombrar objetos de base de datos con SSMS y la función de renombrado seguro de ApexSQL Refactor.

En el siguiente ejemplo, vamos a crear la nueva base de datos NewDB, y dos tablas Users y Address. La tabla Address tendrá referencias foráneas a la tabla Users:

CREATE DATABASE NewDB;CREATE TABLE Users (UserID INT PRIMARY KEY IDENTITY(1, 1),FirstName VARCHAR(20),Lastname VARCHAR(50),Address VARCHAR(250))GOCREATE TABLE Address (ID INT NOT NULL IDENTITY(1, 1),City VARCHAR(120),PostalCode INT,UserAddressID INT FOREIGN KEY REFERENCES Users(UserID))GO

A continuación, cree dos procedimientos almacenados sp_GetUserAddress y sp_GetUserCity:

CREATE PROCEDURE sp_GetUserAddressASBEGINSELECT FirstName,Lastname,AddressFROM UsersENDGOCREATE PROCEDURE sp_GetUserCityASBEGINSELECT Users.FirstName,Users.Lastname,Address.CityFROM UsersINNER JOIN Address ON Users.UserID = Address.UserAddressIDENDGO

Y, al final, crea la vista v_Address01 y el trigger trgAfterInsert:

CREATE VIEW .ASSELECT ID,City,PostalCode,UserAddressIDFROM dbo.AddressINNER JOIN Users ON Users.UserID = Address.UserAddressIDGOCREATE TRIGGER trgAfterInsert ON .FOR INSERTASPRINT 'Data entered successfully'GO

Reconocer los objetos de la base de datos con SSMS

Para ver las dependencias de la tabla Usuarios, selecciónela en el Explorador de objetos y elija en el menú contextual el comando Ver dependencias.

Este comando abrirá la ventana de Dependencias de objetos para la tabla seleccionada, en este caso para la tabla Usuarios. En la lista de la ventana de Dependencias de Objetos están todos los objetos de la base de datos NewDB, que dependen de la tabla Usuarios:

Algunos de los objetos referenciados tienen dependencias ligadas al esquema de la tabla Usuarios (trigger trgAfterInsert y tabla Dirección), y otros tienen dependencias no ligadas al esquema (procedimientos almacenados sp_GetUserCity y sp_GetUserAddress, y vista v_Address01).

Los objetos de la base de datos que tienen dependencias vinculadas al esquema con la tabla Users aceptarán automáticamente todos los cambios realizados. Después de cambiar el nombre de la tabla Users, no habrá ningún error relacionado con las dependencias.

Pero, la modificación del nombre de la tabla Users, hará que los objetos de dependencias no vinculadas al esquema no sean válidos. Para utilizar estos objetos de la base de datos después de que la tabla Usuarios sea renombrada, su código debe ser modificado manualmente.

Para ver eso en el ejemplo, seleccione la tabla Usuarios en la ventana del Explorador de Objetos y desde el menú contextual haga clic en el comando Renombrar:

Introduzca el nuevo nombre para la tabla Usuarios, por ejemplo NewUsers y actualice la base de datos NewDB. En la lista de tablas se renombrará como NewUsers:

Después de introducir el nuevo nombre para la tabla, y refrescar la base de datos, la lista de objetos referenciados cambiará. Compruebe si las dependencias han cambiado para la tabla NewUsers renombrada. Una vez más, seleccione la tabla NewUsers y haga clic en el comando View Dependencies:

La lista de objetos referenciados ha cambiado.

El procedimiento almacenado sp_GetUserAddress ya no está en la lista de los objetos referenciados. La ejecución de este procedimiento almacenado terminará con el siguiente mensaje:

Msg 208, Level 16, State 1, Procedure sp_GetUserAddress, Line 4
Invalid object name ‘Users’.

Por otro lado, el procedimiento almacenado sp_GetUserCity y la vista v_Address01 siguen en la lista, pero cuando se utilizan, se producen errores:

Msg 208, Level 16, State 1, Procedure sp_GetUserCity, Line 8
Invalid object name ‘dbo.Users’.

Msg 208, Level 16, State 1, Procedure v_Address01, Line 8
Invalid object name ‘dbo.Users’.
Msg 4413, Nivel 16, Estado 1, Línea 1
No se ha podido utilizar la vista o función ‘v_Address01’ debido a errores de vinculación.

Esto demuestra que al renombrar una tabla, con SSMS, no se actualizan automáticamente todos los objetos de la base de datos que hacen referencia a ella. El código de los objetos que tienen dependencias no ligadas al esquema de la tabla Usuarios, debe ser actualizado manualmente. Hasta que no se abra el script de todos los objetos y se cambie cada referencia a la tabla Usuarios por NuevosUsuarios, no se podrá seguir utilizando estos objetos sin errores.

Renombrar objetos de base de datos con ApexSQL Refactor

ApexSQL Refactor, complemento de Visual Studio y SSMS, proporciona más de 200 opciones de formato y 15 refactores de código para formatear y refactorizar código SQL y objetos de base de datos.

Una de las características de refactorización de código SQL de ApexSQL Refactor es Safe rename. Esta característica proporciona renombrar los objetos de SQL Server sin romper las dependencias de la base de datos. Los objetos de la base de datos que se pueden renombrar con esta característica de ApexSQL Refactor son: tablas, vistas, procedimientos, funciones, columnas de tablas/vistas y parámetros de procedimientos/funciones.

Para ver cómo funciona la característica Safe rename, seleccione la tabla Users en el Explorador de Objetos y desde el menú contextual haga clic en el comando Safe rename:

O elija la misma opción desde el menú principal de ApexSQL Refactor:

Aparecerá la ventana de Safe rename:

En los campos, New schema y New name están el esquema y el nombre de la tabla seleccionada.

La notificación – triángulo amarillo parpadeante – muestra que la tabla con este esquema y nombre ya existe.

En esta ventana, el esquema de la tabla se puede cambiar eligiendo uno de los esquemas de la base de datos existentes en la lista desplegable. Al renombrar una tabla con SSMS esta no es una de las opciones. Por ello, para este ejemplo no se cambiará el esquema de la tabla.

Inserte el nuevo nombre de la tabla en el campo New name. Lo importante es saber que no hay ninguna restricción para los caracteres en uso. Para este ejemplo, el nuevo nombre de la tabla Usuarios será NuevosUsuarios.

Haga clic en el botón Vista previa, situado en la esquina inferior izquierda de la ventana Cambio de nombre seguro.

Debajo de la pestaña Script generado se encuentra el script de refactorización T-SQL que tras su ejecución cambiará el nombre de la tabla Usuarios. En esta ventana, el script no se puede modificar, sólo se puede revisar:

Todas las advertencias relacionadas con la tabla de renombramiento, estarán bajo la pestaña Advertencias. Para este ejemplo, no hay advertencias:

Para comprobar todas las acciones que se ejecutarán para renombrar la tabla Usuarios, haz clic en la pestaña Secuencia. Todas las acciones están ordenadas de esa manera, por lo que sus ejecuciones evitarán romper las dependencias entre los objetos:

En la pestaña Dependencias, hay una lista de todos los objetos de base de datos referenciados a la tabla Usuarios. ApexSQL Refactor no hace diferencia entre los objetos de dependencia ligados al esquema y los no ligados al esquema, porque todos los objetos referenciados se actualizarán independientemente del tipo de dependencia a la tabla Usuarios:

Para renombrar la tabla Usuarios simplemente haga clic en el botón Crear script. El script generado se abrirá en la ventana del editor de consultas de SSMS:

En el editor de consultas se puede modificar el script o ejecutarlo tal cual. Tras la ejecución, aparecerá el siguiente mensaje:

Precaución: Cambiar cualquier parte del nombre de un objeto podría romper los scripts y los procedimientos almacenados.

Después de refrescar la base de datos NewDB en la lista de tablas, en lugar de la tabla Users estará la tabla NewUsers, igual que después de renombrar la tabla con SSMS, pero con una gran diferencia – ninguno de los objetos referenciados no son inválidos.

Sólo para comprobarlo, si se comprueban las dependencias de la tabla renombrada NewUsers con la función View dependencies de SSMS, aparecerá esta lista:

Esta lista es exactamente la misma que la primera, antes de cambiar el nombre de la tabla con ApexSQL Refactor.

Con la función Safe rename de ApexSQL Refactor es más fácil cambiar el nombre de la tabla y lo que es más, sin ningún trabajo adicional para cambiar todos los objetos referenciados. Además, en una sola ventana se puede comprobar todo lo relacionado con el renombramiento (advertencias, secuencias, dependencias).

Este ejemplo mostraba cómo renombrar una tabla, pero los mismos pasos son para renombrar cualquiera de los objetos de la base de datos de SQL Server (columnas de tablas/vistas, parámetros de funciones/procedimientos, vistas, funciones, procedimientos).

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *