Transferindo a estrutura de uma tabela no Microsoft SQL Server 2008, 2012 e 2014 através da opção Switch

Olá pessoal, bom dia!!!

Tudo bem? Segunda – feira começando, já estamos no Outono, meados do mês de Abril de 2015, e o tempo passando, e como sempre todos nós tentando acompanhar esta frenética correria do dia-a-dia.

O engraçado é justamente isso, este agito, esta loucura, esta busca por ultrapassar obstáculos que muitas vezes acaba nos limitando ou até mesmo impedindo de procurar encontrar soluções simples para nossas necessidades.

Foi um simples bate-papo com um amigo de trabalho, que me fez pensar e escrever este artigo, levando em consideração uma simples solução que utilizamos na semana passada para simular e resolver o que parecia ser um grande problema, mas que na verdade era algo bastante simples.

 

Introdução

O cenário como de costume parecia ser bastante estranho, transferir dados entre tabelas em um banco de dados no Microsoft SQL Server sem fazer uso do comando Insert, de cara eu pensei um utilizar o comando Select….Into, mas na verdade não era isso o que precisávamos, pois a tabela que iria receber os dados já existia, então o Select…Into veio por água abaixo.

Outras soluções como BPCP, Bulk-Insert, SQLCMD e SSIS foram pensadas mas por limitações do escopo não permitidas, foi ai que questionamentos novamente o cenário e reconhecemos que na verdade não era uma transferência de dados que deveria ser feita, o que realmente devíamos fazer para atender a necessidade apresentada era transferir a estrutura de uma tabela com todo seu conjunto de informações para outra.

Você pode estar estranhando, como nós também achamos meio fora do comum, transferir a estrutura de uma tabela para outra, alguns questionamentos e até mesmo pensamos foram feitos, como por exemplo: Isso é que coisa de doido, que loucura…

Bom, deixamos de lado e seguimos em frente, nosso objetivo era transferir a estrutura de uma tabela para outra sem correr o risco de perder dados, como também, não alterar em nada todo ambiente criado e utilizado pelo cliente.

 

A busca pela solução….

Até ai, tudo bem estranho, confuso e até mesmo um pouco obscuro, mas como eu costume dizer vivendo, estudando e aprendendo, comecei a buscar um pouco mais de cenários similares a este e recorrer ao Pai de Todos do SQL Server, este me referindo ao Books On-Line e foi justamente nele que encontrei a solução simples e prática para nosso problema obscuro, utilizar a opção Switch existente no comando Alter Table.

Algo que sinceramente eu nunca tinha pensado, utilizar esta opção para transferir a estrutura física e lógica de uma tabela, era algo que me parecia ser algo de outro mundo, acabei sendo pego de surpresa e mais uma vez espantado com o poder e inteligência do Microsoft SQL Server.

 

Entendendo como a opção Switch trabalha

Vamos lá, acredito que você saiba que o comando Alter Table é utilizado no Microsoft SQL Server como recurso de linha de comando que permite alterar todo estrutura de uma tabela, desde a simples opção de adicionar ou remover uma coluna, como também, trabalhar com particionamento de dados, definir níveis de escalonamento, reindexação de índices, entre outros recursos e funcionalidades. O foco deste artigo não é explicar como utilizar o comando Alter Table, caso você queira saber mais acesse: https://msdn.microsoft.com/pt-br/library/ms190273.aspx

Seguinte em frente, vou destacar de forma resumido e bastante simples a opção Switch, esta opção foi introduzida no Microsoft SQL Server a partir da versão 2008 e presente na atual versão 2014, basicamente este recurso possui a finalidade de realizar a alteração de um bloco de dados que alocado a uma tabela ou partição.

Comportamento

Alterna um bloco de dados em um dos seguintes modos:

  • Reatribuir todos os dados de uma tabela como uma partição para uma tabela particionada já existente;
  • Alterna uma partição de uma tabela particionada para outra; e
  • Reatribuir todos os dados em uma partição de uma tabela particionada para uma tabela não particionada existente.

 

Considerações e Preocupações

Como estaremos fazendo a “transferência” atribuição de dados de uma partição que forma uma tabela única, devemos ter as seguintes preocupações:

    • A tabela de destino já deve ter sido criada e deve estar vazia
    • A tabela de origem ou a partição e a tabela de destino ou a partição devem residir no mesmo grupo de arquivos; e
  • Os índices correspondentes ou as partições de índice também devem residir no mesmo grupo de arquivos. 

 

 

Sintaxe

Alter Table Table_Name_Source

Switch To Table_Name_Destination

 

Então galera, agora que já conhecemos o que a opção Switch é capaz de fazer, seu comportamento, considerações e preocupações, sua sintaxe e forma de uso, podemos começar a colocar a mão na massa e brincar um pouco com este recurso. Para realizarmos a simulação do uso do Switch, vamos trabalhar com duas tabelas, denominadas:

  • TBOrigem; e
  • TBDestino

Vale ressaltar que ambas as tabelas terão a mesma estrutura, contendo quatro colunas:

Nome da Coluna Tipo de Dados e Constraint
Codigo Int Primary Key
Texto Varchar(100)
Contador UniqueIdentifier
datacadastro DateTime Default Getdate()

 

Agora mão na massa, começando pelo Passo 1 – Criando as Tabelas:

— Passo 1 – Criando as tabelas TBOrigem e TBDestino –

— Utilizando o banco de dados TempDB–

Use TempDB

Go

 

— Criando a Tabela TBOrigem —

Create Table TBOrigem

(Codigo Int Primary Key Identity(1,1),

Texto Varchar(100),

Contador UniqueIdentifier Not Null,

DataCadastro DateTime Default GetDate())

Go

 

— Criando a Tabela TBDestino —

Create Table TBDestino

(Codigo Int Primary Key Identity(1,1),

Texto Varchar(100),

Contador UniqueIdentifier Not Null,

DataCadastro DateTime Default GetDate())

Go

 

— Passo 2 – Inserindo a massa de dados na Tabela TBOrigem —

Insert Into TBOrigem (Texto, Contador)

Values(‘Este é um teste de transferência de estrutura…’, NEWID())

Go 10000

 

Você pode observar que o bloco de código é bastante simples, estamos inserindo uma massa considerável de dados, são 10.000 linhas de registros inseridas fazendo com que o SQL Server venha a distribuir esta estrutura de alocação de registros em diversas páginas de dados que estarão formando a estrutura física e lógica da Tabela TBOrigem.

Agora para começarmos a entender como a opção Switch vai trabalhar, vamos fazer uso do comando DBCC Ind, este é um dos comandos da categoria DBCCs que consta na lista de comandos ou recursos não documentadas pela Microsoft.

O comando DBCC Ind tem como finalidade apresentar as informações sobre as páginas de dados que compõem uma determinada tabela, para isso vamos utilizar o Passo 3, apresentado abaixo:

 

— Passo 3 – Consultando informações sobre as páginas de dados e estruturas das Tabelas —

DBCC Ind(‘TempDB’,’TBOrigem’,1)

Go

 

Note que ao executar o comando DBCC Ind na tabela TBOrigem o Management Studio nos retornou 115 linhas de registro que representam as páginas de formam nossa tabela levando-se em consideração também as páginas que podem formam o nosso índice clusterizado que está associado a chave primária. A Figura 1 apresentada a seguir ilustra o resultado do comando DBCC Ind:

Switch-Figura 1

Figura 1 – Informações sobre as páginas de dados que compõem a Tabela TBOrigem.

Para saber mais sobre o DBCC Ind acesse o SQL Server Store Engine Blog: http://blogs.msdn.com/b/sqlserverstorageengine/archive/2006/12/13/more-undocumented-fun_3a00_-dbcc-ind_2c00_-dbcc-page_2c00_-and-off_2d00_row-columns.aspx

Vale ressaltar que a partir da versão 2012 o DBCC Ind foi substituído pela DMF – Dynamic Management Function: SYS.DM_DB_DATABASE_PAGE_ALLOCATIONS, conforme apresenta Muhammad Imran em seu post: http://raresql.com/2013/01/24/sql-server-2012-sys-dm_db_database_page_allocations-dynamic-management-function/

 

Talvez você estar se perguntando, preciso executar o comando DBCC Ind para tabela TBDestino? A resposta é Não, pois neste momento a tabela TBDestino encontra-se vazia, ou seja, não existe nenhum tipo de páginas de dados que forma esta tabela.

Dando continuidade, agora é a hora de realmente colocarmos em prática o que queremos fazer, “transferir” ou “atribuir” a estrutura física e lógica da tabela TBOrigem para tabela TBDestino, fazendo uso da opção Switch em conjunto como comando Alter Table. Para tal, vamos executar o Passo 4 apresentado abaixo:

— Passo 4 – Transferindo a estrutura da Tabela TBOrigem para Tabela TBDestino —

Alter Table TBOrigem Switch To TBDestino

Go

 

Muito bem, a primeira parte do passo 4 foi executado, neste momento toda estrutura da Tabela TBOrigem foi repassada para a TBDestino, para começarmos a comprovar esta transferência, vamos executar os dois comandos Selects apresentados a seguir:

Select Codigo, Texto, Contador, DataCadastro from TBOrigem

Go

 

Select Top 100 Codigo, Texto, Contador, DataCadastro from TBDestino

Go

 

Após executar os comandos Selects, você deverá ter se deparado com o mesmo resultado apresentado para Figura 2:

Switch-Figura 2

Figura 2 – Resultado da execução dos comandos Selects.

Ai esta, em uma simples linha de código toda estrutura da Tabela TBOrigem, seus respectivos dados alocados em suas especificadas de páginas de dados foram realocados para a Tabela TBDestino sem realizarmos qualquer tipo de manipulação de dados através de comandos DML, algo fantástico, surpreendente e que nos permite pensar o quanto o Microsoft SQL Server em conjunto com suas funcionalidades e algoritmos é capaz de manipular seus objetos.

Agora para comprovar de forma definitiva, vamos executar o Passo 5, consultando a relação de páginas de dados que compõem nossas tabelas:

 

— Passo 5 – Transferindo a estrutura da Tabela TBOrigem para Tabela TBDestino —

DBCC Ind(‘TempDB’,’TBOrigem’,1)

Go

DBCC Ind(‘TempDB’,’TBDestino’,1)

Go

 

Após executar o passo 5, a caixa de Mensagens do Management Studio deverá apresentar o seguinte resultado, conforme ilustra a Figura 3:

Switch-Figura 3

Figura 3 – Mensagens apresentadas após a execução do comando DBCC Ind.

Além disso, ao executar o segundo DBCC Ind, você poderá observar e comprovar que as mesmas máquinas de dados que estavam vinculadas a Tabela TBOrigem foram repassadas para Tabela TBDestino, conforme apresenta a Figura 4:

Switch-Figura 4

Figura 4 – Execução do comando DBCC Ind, obtendo a relação de páginas de dados da Tabela TBDestino.

Conclusão

Falar do Microsoft SQL Server realmente não é fácil, ainda mais quando a resposta para um problema que parece ser de outro mundo, pode muitas vezes estar na nossa frente, o artigo que hoje mostrou justamente isso, o quando o SQL Server vem a cada versão evoluindo, demonstrando que é uma Plataforma de Gerenciamento de Banco de Dados em todos os aspectos e não simplesmente um mero repositórios de tabelas e registros.

Através da opção Switch introduzida no comando Alter Table a partir da versão 2008 do Microsoft SQL Server, temos a capacidade técnica de inferir diretamente na estrutura de alocação de uma tabela ou partição, algo que parecia ser tão complexo e custoso pode ser feito através de uma simples linha de código.

Acredito ter conseguido de forma clara, simples e didática apresentar uma forma de uso desta opção, sem requerer qualquer tipo de configuração específica ou até mesmo uso de recursos mais avançados, além disso, fizemos uso do comando DBCC Ind para obter as informações sobre as páginas de dados, sabemos que o mesmo a partir da versão 2012 foi substituído pela DMF: SYS.DM_DB_DATABASE_PAGE_ALLOCATIONS.

Espero que você possa ter gostado deste artigo, que as informações, links e exemplos possam lhe ajudar e permitir que você conheça cada vez mais o Microsoft SQL Server, seus segredos, recursos e diversidades de funcionalidades.

Vou fincado por aqui, mas uma vez obrigado por sua visita, nos encontramos em breve.

Até mais.

Autor: Junior Galvão - MVP

Profissional com vasta experiência na área de Tecnologia da Informação e soluções Microsoft. Graduado no Curso Superior em Gestão da Tecnologia de Sistemas de Informação pela Uninove - Campus São Roque. Pós-Graduado no Curso de Gestão e Engenharia de Processos para Desenvolvimento de Software com RUP na Faculdade FIAP - Faculdade de Informática e Administração Paulista de São Paulo. Pós-Graduado em Gestão da Tecnologia da Informação Faculdade - ESAMC Sorocaba. Cursando Mestrado em Ciências da Computação - UFSCar - Campus - Sorocaba. Formação MCDBA Microsoft, autor de artigos acadêmicos e profissionais postados em Revistas, Instituições de Ensino e WebSistes. Meu primeiro contato com tecnologia ocorreu em 1995 após meus pais comprarem nosso primeiro computador, ano em que as portas para este fantástico mundo se abriram. Neste mesmo ano, comecei o de Processamento de Dados, naquele momento a palavra TI não existia, na verdade a Tecnologia da Informação era conhecida como Computação ou Informática, foi assim que tudo começou e desde então não parei mais, continuando nesta longa estrada até hoje. Desde 2001 tenho atuado como Database Administrator - Administrador de Banco de Dados - SQL Server em tarefas de Administração, Gerenciamento, Migração de Servidores e Bancos de Dados, Estratégias de Backup/Restauração, Replicação, LogShipping, Implantação de ERPs que utilizam bancos SQL Server, Desenvolvimento de Funções, Stored Procedure, Triggers. Experiência na Coordenação de Projetos de Alta Disponibilidade de Dados, utilizando Database Mirroring, Replicação Transacional e Merge, Log Shipping, para versões: 2000, 2005, 2008, 2008 R2, 2012 e 2014. Atualmente trabalho como Administrador de Banco de Dados no FIT - Instituto de Tecnologia da Flextronics, como também, Consultor em Projetos de Tunnig e Performance para clientes. Desde 2008 exerço a função de Professor Universitário, para as disciplinas de Banco de Dados, Administração, Modelagem de Banco de Dados, Programação em Banco de Dados, Sistemas Operacionais, Análise e Projetos de Sistemas, entre outras. Possuo titulação Oficial Microsoft MVP - SQL Server renovada desde 2007.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s