2010-01-15 3 views
1

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

ответ

2

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

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

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

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

+0

Это гораздо лучший подход, чем удаление методом проб и ошибок. – Paddy

+0

Я знаю, что это за ошибка, я просто хочу использовать ошибку вместо того, чтобы WHERE, т. е. удалять все строки, которые можно удалить. – Shimmy

+0

Вы не сможете на SQL Server, не перепрыгивая через обручи (запустите удаление пакета цикла и сделайте размер партии только 1 - и используйте Set XACT и т. д. - учитывая thos e hoops, и вы знаете, где предложение, в котором вы нуждаетесь, я бы просто использовал его. – Andrew

0

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

Например, Oracle предлагает нам возможность регистрировать ошибки DML навалом. The example in the documentation uses an INSERT statement, но тот же принцип применяется к любому оператору DML.

+0

Я ответил на свой вопрос, это MS SQL-Server. – Shimmy

Смежные вопросы