Skip Navigation Links
Novas Tecnologias
Ferramentas Adicionais
Ferramentas Adicionais


Dica No :
349
Assunto : SQL Server
Titulo: Evitando falhas com o Identity

Gostou do texto ? Vote e dê sua opinião! Pontuação atual :

Translate this page now :






Adicione aos Favoritos!
BlogBlogs Rec6 Linkk Ueba Technorati Delicious DiggIt! StumbleUpon



Imaginemos a seguinte estrutura tabela/trigger :

create table teste5
(
x int identity(1,1),
y int )


create table teste6
(x int identity(1,1),
y int)

create trigger trginsert on teste5 for insert AS
insert into teste6 select y from inserted

Por acaso as duas tabelas tem quantidade de registros diferentes neste momento (faça um número diferenciado de inserts nas tabelas se desejar reproduzir este teste)

É comum utilizarmos a variável global @@Identity para recuperarmos o valor de identity recentemente inserido em uma tabela. O @@Identity, apesar de conhecido como variável global, é isolado por sessão, não causando problemas de concorrência. Veja o exemplo mais usado :

insert into teste5 values(20)
select @@identity

O problema é que esta tabela possui um trigger que também gera inserts em tabelas com identity. O valor de @@Identity é alterado devido aos inserts realizados pelo trigger, desta forma o valor que será retornado não é o do identity da teste5, mas sim o do identity da teste6 !

Outra alternativa existente é o ident_current, que permite obtermos o valor atual de identity em uma determinada tabela. Veja um exemplo :

insert into teste5 values(20)
select ident_current('teste5')

Se estiver testando isso, irá parecer que funcionou, devolverá o identity da tabela teste5. O problema é que o ident_current não está preso a uma sessão, então se estiverem ocorrendo muitas inserções simultâneas o valor que ele poderá estar devolvendo pode não ser o da sua inserção.

Isso é solucionável, claro, aumentando o nível de lock, mas o melhor é utilizar o escope_identity(), veja :


insert into teste5 values(20)
select scope_identity()

O scope_identity está vinculado a sessão do usuário e devolve o último identity inserido dentro do escopo de um determinado batch. Como o trigger é considerado um outro escopo, o valor de identity da tabela teste5 será devolvido corretamente.


Nome :
E-mail:
Comentarios :
 
 
Os Últimos Comentários
data: 7/11/2012 10:37:00 AM
nome: Legiaosetecidades
email: legiaosetecidades@yahoo.com.br
comentário:
Muito Bom Artigo. Valew

 1  
Dicas
Dica do Dia
Receba Dicas Por Email
E-mail :  
 


 (help)
Aceito receber informativos do devASPNet, informações de eventos e treinamentos

Veja Quais Informativos Você Receberá

Pesquisar Dicas
Pesquisar Artigos, Dicas e Noticias

Banco de Dados
Algumas Entrevistas
Links Importantes

Búfalo Informática, Treinamento e Consultoria
R. Alvaro Alvim, 37/920 Centro - Cinelândia - Rio de Janeiro Cep: 20031-010
Tel : (21) 2262-1368 (21) 9240-5134 E-mail : Contato@bufaloinfo.com.br