Nossos primeiros erros

/*

       O objetivo deste post é bem simples. Quando iniciamos nossa vida de DBA/Desenvolvedor nos deparamos com erros simples que nos roubam um tempo precioso na procura pela resposta. Acredito que esse tempo se perde pela mensagem de erro dificil ou pela tradução para o portugues que é terrivel no SQL. (eu prefiro usar tudo no inglês mesmo)

*/

-- Crie essa simples tabela.

CREATE TABLE PrimeirosErros (ErroID int identity(1,1) PRIMARY KEY,Erro varchar(5))

-- Primeiro erro

INSERT INTO PrimeirosErros (Erro) VALUES ('123456')

/*

-- Erro --------------

Msg 8152, Level 16, State 14, Line 1

String or binary data would be truncated.

OU

Msg 8152, Level 16, State 14, Line 1

Dados de cadeia ou binários seriam truncados.

----------------------

       Explicação: Voce está inserindo um valor que estoura o tamanho maximo da coluna (Valor com 6 caracteres, campo definido para 5 caracteres)

       Basta reduzir o tamanho que voce está inserindo ou aumentar a capacidade da coluna que voce está Parece besta, mas ja vi muito cara bom ficar um pouco perdido com essa mensagem esquisita.

*/

-- Segundo erro:

INSERT INTO PrimeirosErros VALUES (1,'Teste' )

/*

-- Erro --------------

Msg 8101, Level 16, State 1, Line 1

Um valor explícito para a coluna de identidade na tabela 'PrimeirosErros' só pode ser especificado quando uma lista de colunas é usada e o valor de IDENTITY_INSERT é ON.

OU

Msg 8101, Level 16, State 1, Line 1

An explicit value for the identity column in table 'PrimeirosErros' can only be specified when a column list is used and IDENTITY_INSERT is ON.

*/



/*

Explicação: A coluna é identity (no popular auto-numérica). Como voce está forçando um valor para a coluna identity, voce deve ligar o INDENTY_INSERT da tabela para permitir a inclusão

*/

SET IDENTITY_INSERT PrimeirosErros ON

INSERT INTO PrimeirosErros VALUES (1,'Teste' )

/*

       Ué...o erro continuou! E agora DBA?

       A resposta continua simples, além de habilitar a inserção de valores explicitos na coluna voce deve especificar o insert da maneira mais explicita possivel, isto é,

       incluindo a lista de colunas que receberão os dados

*/

INSERT INTO PrimeirosErros (ErroID,Erro) VALUES (1,'Teste' )

/*

       Mas, por favor, não pare por ai. Nunca se esqueça de desligar o identity_insert. Senão ao executar o de baixo....

*/

INSERT INTO PrimeirosErros (Erro) VALUES ('Teste2' )

/*

-- Erro --------------

Msg 545, Level 16, State 1, Line 1

Explicit value must be specified for identity column in table 'PrimeirosErros' either when IDENTITY_INSERT is set to ON or when a replication user is inserting into a NOT FOR REPLICATION identity column.

OU


Msg 545, Level 16, State 1, Line 1

Deve ser especificado um valor explícito para a coluna de identidade na tabela 'PrimeirosErros' quando IDENTITY_INSERT está definido como ON ou quando um usuário de replicação insere em uma coluna de identidade NOT FOR REPLICATION.

----------------------

Voce deve desligar o IDENTITY_INSERT da tabela para voltar tudo ao normal.

*/

SET IDENTITY_INSERT PrimeirosErros OFF


/*
  Espero que essa pequena explicação tenha poupado seu tempo, os erros fazem parte de nossas vidas.
  Se eles não existissem, talvez metade de nós estivesse desempregada :D

Abraços!

Felipe Antunes

AVISO:ESSE POST É UM SCRIPT! SE VOCE DESEJAR, VOCE PODE COPIA-LO E COLA-LO DIRETAMENTE NO SEU MANAGEMENT STUDIO
*/

7 comentários:

  1. Muuuito legal rapaz! Já apanhei do IDENTITY INSERT sem especificar as colunas =p

    ResponderExcluir
  2. Nem sou do bando mas já sofri com esses tb...
    Vc que o diga neh.... era um bug na tela e um e-mail de 'me saaaaaaaalva' uhahahaahahaha

    ResponderExcluir
  3. Parabéns, cara.
    Excelente iniciativa.
    Vlw.

    ResponderExcluir
  4. Excelente Post. Parabéns!

    Esse post me livrou a cara.
    Só fiquei com uma dúvida. Utilizei o begin transaction antes do insert e efetuei um Rollback. Após efetuar um novo insert o campo com o Id nao retornou para sequencia anterior ao primeiro insert, continuou incrementando como se não tivesse executado o rollback.

    ResponderExcluir
    Respostas
    1. Obrigado Fagner!

      Basicamente isso acontece porque mesmo que voce tenha feito o insert e depois o rollback, o ID é "queimado" e segue para a próxima sequencia. O rollback de fato funcionou, mas essa mudança do identity seed não é afetada por ele.

      Abraços!

      Excluir