Quando eu insiro em tabelas usando ao invés de gatilhos, @@Identity
, IDENT_CURRENT('Table')
e SCOPE_IDENTITY()
retorno nulo. Como posso obter a última identidade da linha inserida?
relate perguntas
-
Quais são as principais causas de deadlocks e podem ser evitadas?
-
Quanto "Padding" coloco em meus índices?
-
Existe um processo do tipo "práticas recomendadas" para os desenvolvedores seguirem para alterações no banco de dados?
-
Como determinar se um Índice é necessário ou necessário
-
Downgrade do SQL Server 2008 para 2005
Em vez de disparar, você definitivamente pode obter o valor inserido ... mas não até depois de executar a inserção.
Resultados:
Agora limpe:
Como um aparte, você nunca, nunca, nunca deve estar usando
@@IDENTITY
ou deIDENT_CURRENT()
qualquer maneira. ESCOPE_IDENTITY
deve ser reservado para situações em que você sabe que apenas uma linha pode ser inserida. Um equívoco comum com gatilhos é que eles disparam por linha, como em outras plataformas, mas no SQL Server eles disparam por operação - portanto, uma inserção de várias linhas usandoVALUES(),(),()
ouINSERT...SELECT
- qualSCOPE_IDENTITY
você definiria para sua variável?Com um gatilho INSTEAD_OF, significa que nenhuma inserção ocorreu ainda. Você não pode saber a identidade porque ela ainda não foi gerada. Esconder o valor dos metadados é possível (
DBCC CHECKIDENT
), mas confiar nele não funcionará corretamente na simultaneidade e, além disso, requer privilégios elevados.Gatilhos INSTEAD_OF são extremamente raramente necessários e um cheiro de código sério. Tem certeza que precisa? Você não pode fazer o trabalho com um gatilho AFTER regular?
Problema principal: o framework Trigger e Entity funcionam em escopos diferentes. O problema é que, se você gerar um novo valor de PK no gatilho, o escopo será diferente. Portanto, este comando retorna zero linhas e o EF lançará uma exceção.
A solução é adicionar a seguinte instrução SELECT no final do seu Trigger:
no lugar de * você pode mencionar todo o nome da coluna, incluindo