Как сохранить транзакцию, когда она терпит неудачу для некоторых строк? - PullRequest
1 голос
/ 15 января 2010

Я хочу, чтобы, когда я выполняю запрос, например DELETE FROM Contact, и во время транзакции возникала ошибка, он должен удалять строки, которые можно удалить, в результате чего возникают все соответствующие ошибки для строк, которые нельзя удалить.

Ответы [ 3 ]

2 голосов
/ 15 января 2010

Для SQL Server вы не собираетесь нарушать атомарность команды Delete в пределах одного оператора - даже если он выполняется вне явной транзакции, вы будете действовать в рамках неявной транзакции - например, все или ничего, как вы видели.

В пределах явной транзакции ошибка по умолчанию откатит всю транзакцию, но это можно изменить, чтобы просто попытаться откатить один оператор, который допустил ошибку в общей транзакции (из нескольких операторов). SET XACT_ABORT.

Поскольку ваше удаление - это одно утверждение, XACT_ABORT не может вам помочь - в строке произойдет ошибка, и удаление будет откатано.

Если вы знаете, с какой ошибкой вы столкнетесь (например, нарушение ограничения FK, вы можете убедиться, что у удаления есть подходящее предложение where, чтобы не пытаться удалить строки, о которых вы знаете, что это приведет к ошибке.

0 голосов
/ 15 января 2010

Это функция, которая будет полностью зависеть от того, какой тип базы данных вы используете. У некоторых это будет, а у некоторых нет.

Например, Oracle предлагает нам возможность массово регистрировать ошибки DML. В примере, приведенном в документации, используется оператор INSERT , но тот же принцип применяется к любому выражению DML.

0 голосов
/ 15 января 2010

Если вы используете MySQL , вы можете воспользоваться синтаксисом DELETE IGNORE .

...