Quando eu inserir em tabelas usando em vez de gatilhos, @@Identity
, IDENT_CURRENT('Table')
e SCOPE_IDENTITY()
nulo retorno. Como posso obter a última identidade da linha inserida?
sql-server
sql-server-2008
t-sql
trigger
identity
mehdi lotfi
fonte
fonte
inserted
mas nenhuma linha inserida quando umINSTEAD OF
gatilhos de gatilho.Respostas:
Com um gatilho INSTEAD_OF, significa que ainda não ocorreu nenhuma inserção. Você não pode conhecer a identidade, pois ela ainda não foi gerada. É possível ocultar o valor dos metadados (
DBCC CHECKIDENT
), mas confiar nele não funcionará corretamente em simultâneo e, além disso, requer privilégios elevados.Os gatilhos INSTEAD_OF são extremamente raramente necessários e têm um cheiro sério ao código. Tem certeza de que precisa? Você não pode fazer o trabalho com um gatilho AFTER regular?
fonte
No seu gatilho, em vez do gatilho, 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, 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 os acionadores é que eles são acionados por linha, como em outras plataformas, mas no SQL Server eles são acionados por operação - portanto, uma inserção de várias linhas usandoVALUES(),(),()
ouINSERT...SELECT
- qualSCOPE_IDENTITY
você definiria para sua variável?fonte
Problema principal: A estrutura Trigger e Entity funciona em escopo diferente. O problema é que, se você gerar um novo valor de PK no gatilho, será um escopo diferente. Portanto, este comando retorna zero linhas e EF lançará uma exceção.
A solução é adicionar a seguinte instrução SELECT no final do seu gatilho:
no lugar de *, você pode mencionar todo o nome da coluna, incluindo
fonte