De tempos a tempos, um objecto de base de dados pode ter de ser renomeado por várias razões. Quando isso acontece, as características nativas para renomear objectos de base de dados do SQL Server podem ser muito úteis. Mas, existem grandes diferenças entre a simples renomeação de objectos de base de dados SQL Server no SQL Server Management Studio e a renomeação Safe com o ApexSQL Refactor.
Este artigo irá explicar as diferenças entre a renomeação de objectos de base de dados com SSMS e a funcionalidade de renomeação Safe do ApexSQL Refactor.
No exemplo seguinte, vamos criar a nova base de dados NewDB, e duas tabelas Users and Address. A tabela Endereço terá referências Estrangeiras à tabela 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
Em seguida, criar dois procedimentos armazenados sp_GetUserAddress e sp_GetUserCity:
E, no final, criar view v_Address01 e activar trgApósInserir:
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
Renamingar objectos de base de dados com SSMS
Para ver as dependências para a tabela Utilizadores, seleccione-a no comando Object Explorer e escolha no menu de contexto View Dependencies.
Este comando abrirá a janela Dependências de objectos para a tabela seleccionada, neste caso para a tabela Utilizadores. Na lista da janela Dependências de Objectos estão todos os objectos da base de dados NewDB, que dependem da tabela Utilizadores:
Alguns dos objectos referenciados têm dependências vinculadas a esquemas para a tabela Users (trgApósInserir e Endereço da tabela), e alguns deles têm dependências não vinculadas a esquemas (procedimentos armazenados sp_GetUserCity e sp_GetUserAddress, e ver v_Address01).
Objectos de base de dados que têm dependências vinculadas a esquemas para a tabela Os utilizadores aceitarão automaticamente todas as alterações feitas. Após renomear a tabela Utilizadores, não haverá quaisquer erros relacionados com dependências.
Mas, a modificação do nome dos Utilizadores da tabela, tornará inválidos os objectos de dependências não vinculados a esquemas. Para utilizar estes objectos de base de dados após a renomeação da tabela Users, o seu código deve ser modificado manualmente.
Para ver que, por exemplo, seleccione a tabela Users na janela Object Explorer e no menu de contexto clique no comando Rename:
Introduza um novo nome para a tabela Users, por exemplo NewUsers e actualize a base de dados NewDB. Na lista da tabela será renomeada como NewUsers:
Após a introdução do novo nome para a tabela, e a actualização da base de dados, a lista de objectos referenciados será alterada. Verificar se as dependências são alteradas para a tabela renomeada NewUsers. Mais uma vez, seleccione a tabela NewUsers e clique no comando View Dependencies:
A lista de objectos referenciados é agora alterada.
O procedimento armazenado sp_GetUserAddress já não está na lista de objectos referenciados. A execução deste procedimento armazenado terminará com a seguinte mensagem:
Msg 208, Level 16, State 1, Procedure sp_GetUserAddress, Line 4
Invalid object name ‘Users’.
Por outro lado, o procedimento armazenado sp_GetUserCity e a vista v_Address01 ainda estão na lista, mas quando estes são utilizados, os erros serão levantados:
Msg 208, Nível 16, Estado 1, Procedimento sp_GetUserCity, Linha 8
Nome do objecto inválido ‘dbo’.Users’.
Msg 208, Nível 16, Estado 1, Procedimento v_Address01, Linha 8
Nome do objecto inválido ‘dbo.Users’.
Msg 4413, Nível 16, Estado 1, Linha 1
Não poderia usar view ou função ‘v_Address01’ devido a erros de ligação.
Isto prova que a renomeação de uma tabela, com SSMS, não actualizará automaticamente todos os objectos da base de dados que se referem a ela. O código dos objectos que têm dependências não vinculadas ao esquema aos Utilizadores da tabela, deve ser actualizado manualmente. Até que o script de cada objecto seja aberto e cada referência à tabela Utilizadores seja alterada para NewUsers, não é possível continuar a utilizar estes objectos sem erros.
Renamingar objectos de base de dados com ApexSQL Refactor
ApexSQL Refactor, Visual Studio e SSMS add – in, fornece mais de 200 opções de formatação e 15 refactores de código para formatação e refactoring SQL code e objectos de base de dados.
Uma das características de refactoring de código SQL do ApexSQL Refactor é Safe rename. Esta funcionalidade permite renomear objectos do SQL Server sem quebrar as dependências da base de dados. Os objectos da base de dados que podem ser renomeados com esta funcionalidade do Refactor ApexSQL são: tabelas, vistas, procedimentos, funções, colunas tabela/visualização e parâmetros de procedimentos/funções.
Para ver como funciona a funcionalidade Renomear Segura, seleccionar a tabela Utilizadores no Explorador de Objectos e no menu de contexto clicar no comando Renomear Segura:
Ou escolher a mesma opção do menu principal do Refactor ApexSQL:
Aparecerá a janela de Renomeação Segura:
Nos campos, Novo esquema e Novo nome são o esquema e o nome da tabela seleccionada.
Notificação – triângulo amarelo intermitente – mostra que a tabela com este esquema e nome já existe.
Nesta janela, o esquema da tabela pode ser alterado escolhendo um dos esquemas de base de dados existentes na lista pendente. Quando se renomeia uma tabela com SSMS, esta não é uma das opções. Devido a isso, para este exemplo o esquema de tabela não será alterado.
Inserir novo nome de tabela no campo Novo nome. O importante é saber que não existem quaisquer restrições para os caracteres em uso. Para este exemplo, o novo nome para a tabela Utilizadores será NewUsers.
Clique no botão Preview, localizado no canto inferior esquerdo da janela Safe rename.
Sob a tabulação Generated script é T-SQL refactoring script que após a execução irá renomear a tabela Utilizadores. Nesta janela, o script não pode ser alterado, só pode ser revisto:
Todos os avisos relacionados com a renomeação da tabela, estarão sob a tabulação Avisos. Para este exemplo, não há avisos:
Para verificar todas as acções que serão executadas para renomear a tabela Utilizadores, clique na tabulação Sequência. Todas as acções são ordenadas dessa forma, pelo que as suas execuções evitarão a quebra de dependências entre os objectos:
Sob o separador Dependências, existe uma lista de todos os objectos de base de dados referenciados para a tabela Utilizadores. O Refactor ApexSQL não faz diferença entre objectos de dependências ligadas a esquemas e não ligadas a esquemas, porque todos os objectos referenciados serão actualizados independentemente do tipo de dependências à tabela Utilizadores:
Para renomear a tabela Utilizadores basta clicar no botão Criar script. O script gerado será aberto na janela do editor SSMS Query:
No editor Query, o script pode ser modificado ou pode ser executado tal como está. Após a execução, aparecerá a seguinte mensagem:
Cautela: Alterar qualquer parte do nome de um objecto pode quebrar scripts e procedimentos armazenados.
Após actualizar a base de dados NewDB na lista de tabelas, em vez da tabela os Utilizadores serão a tabela NewUsers, tal como depois de renomear a tabela com SSMS, mas com uma grande diferença – nenhum dos objectos referenciados não são inválidos.
Apenas para verificação, se as dependências da tabela renomeada NewUsers forem verificadas com a funcionalidade View dependencies do SSMS, esta lista aparecerá:
Esta lista é exactamente a mesma que a primeira, antes de alterar o nome da tabela com o Refactor ApexSQL.
Com a funcionalidade de renomeação segura do ApexSQL Refactor, é mais fácil renomear a tabela e mais, sem qualquer trabalho adicional para alterar todos os objectos referenciados. Além disso, numa janela todas as coisas relativas à renomeação podem ser verificadas (avisos, sequências, dependências).
Este exemplo mostrou como renomear uma tabela, mas os mesmos passos são para renomear qualquer dos objectos da base de dados do SQL Server (colunas tabela/visualização, parâmetros de funções/procedimentos, vistas, funções, procedimentos).