Pergunta

Eu quero isso quando eu executar uma consulta por exemplo DELETE FROM Contact, e um erro é levantado durante a transação, ele deve excluir as linhas capazes de ser excluídas levantando todos os erros relevantes para as linhas que não podem ser excluídas.

Foi útil?

Solução

Para o SQL Server, você não vai quebrar a atomicidade do comando Delete em uma única declaração - mesmo emitida fora de uma transação explícita, você estará agindo dentro de um implícito - por exemplo, tudo ou nada como você viu.

Dentro dos reinos de uma transação explícita, um erro, por padrão, reverterá a transação inteira, mas isso pode ser alterado para tentar reverter a instrução única que errou na transação geral (de múltiplas instruções), a configuração para isso é definida xact_abort.

Como o seu exclusão é uma única instrução, o xact_abort não pode ajudá -lo - a linha errará e o exclusão será revertido.

Se você souber a condição de erro que enfrentará (como uma violação de restrição de FK, poderá garantir que você exclua uma cláusula adequada para não tentar excluir linhas que você sabe que gerarão um erro.

Outras dicas

Se você está usando Mysql você pode aproveitar o DELETE IGNORE sintaxe.

Este é um recurso que dependerá inteiramente do sabor do banco de dados que você está usando. Alguns terão e outros não.

Por exemplo, o Oracle nos oferece a capacidade de registrar erros DML a granel. O exemplo na documentação usa uma declaração de inserção Mas o mesmo princípio se aplica a qualquer instrução DML.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top