Обрабатывать ошибку в SQL Trigger без сбоя транзакции? - PullRequest
0 голосов
/ 09 июня 2009

Я чувствую, что это может быть невозможно, но здесь идет ...

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

Что я недавно обнаружил, так это то, что иногда двоичные данные не являются «правильными» (то есть они не соответствуют спецификации, которую предполагается - я НИКОГДА не контролирую это), и это может привести к ошибкам приведения и т.д.

Моя первоначальная реакция заключалась в том, чтобы обернуть объекты в блоки TRY / CATCH, но, похоже, это тоже не решение, так как выполнение CATCH означает, что транзакция обречена, и я получаю ошибку «Транзакция обречена на запуск».

Что не впечатляет, так это то, что данные все еще записываются в исходную таблицу. Мне все равно, будут ли данные записаны во вторую таблицу или нет.

Я не уверен, смогу ли я выполнить это или нет, и с благодарностью получил бы любой совет.

Ответы [ 2 ]

1 голос
/ 09 июня 2009

Не похоже, что этот код должен запускаться в триггере вставки, поскольку концептуально это две разные транзакции. Вам, вероятно, будет лучше с асинхронной обработкой, такой как сервисный брокер, фоновая задача няни, которая ищет «не выполненную» работу и т. Д. Вы также можете справиться с этим, используя sproc, чтобы выполнить вставку в одной транзакции, а затем вызвать ее. код «делай другую работу» потом.

Если вам абсолютно необходимо сделать это в триггере, то вам в основном нужна автономная транзакция. Для некоторых идей см. эту ссылку (методы применимы и к SQL 2005).

1 голос
/ 09 июня 2009

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

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

...