powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Откат в триггере?
21 сообщений из 21, страница 1 из 1
Откат в триггере?
    #32018352
День добрый.

Такая вот проблема, как откатить INSERT в таблицу из триггера на эту таблицу(по какому-то условию). Вся эта операция происходит в одной большой транзакции и эту транзакцию откатывать нельзя.
Зарание спасибо,
Дмитрий
...
Рейтинг: 0 / 0
Откат в триггере?
    #32018355
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Garya Привилегированный пользователь
Участник
Это можно сделать не откатом, а удалением только что вставленных записей в триггере:
delete from MyTable
from MyTable T
inner join inserted I
on T.ID=I.ID
...
Рейтинг: 0 / 0
Откат в триггере?
    #32018363
папа Карло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понял, то при возникновении своего условия пишешь rollback tran и все.
...
Рейтинг: 0 / 0
Откат в триггере?
    #32018373
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В контексте приведенной задачи писать rollback в триггере нельзя, потому что произойдет откат не только последней операции, но и всей транзакции. Удаление только что вставленных записей - штука неплохая, но где гарантия, что написанный там delete сработает без ошибок (нарушения целостности, работа других триггеров и т.д.)? Никакой. В "лабораторных условиях" все будет работать замечательно, а в один прекрасный день в реальной ситуации вы очень удивитесь... Может, в данном случае лучше не допускать неправильных инсертов?
...
Рейтинг: 0 / 0
Откат в триггере?
    #32018384
Владимир Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать такой вариант (правда я не уверен, что он будет работать в разных версиях SQL - у меня 7.0):
В триггере, где надо откатить напишите
ROLLBACK TRANSACTION T_INSERT_MyTable -- Или другое название, как захотите

А перед вставкой записей добавьте
SAVE TRANSACTION T_INSERT_MyTable -- название сохраняемой точки отката, как в триггере

Всё.
...
Рейтинг: 0 / 0
Откат в триггере?
    #32018386
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему нельзя воспользоваться instead триггерами?
проверяешь уловие и если не проходит, то просто не вставляешь и все ..
...
Рейтинг: 0 / 0
Откат в триггере?
    #32018391
Дмитрий, у Вас нелогичная схема работы приложения. Из-за этого и вопрос, ставящий всех в тупик. Зачем объявлять транзакцию (единую-неделимую по-определению), если отдельная её часть должна жить своей жизнью?

Отказать в жёсткой форме!
(С) Советская бюрократия
...
Рейтинг: 0 / 0
Откат в триггере?
    #32018404
Владимир Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Глеб Уфимцев, зачем так строго
Транзакция "единой-неделимой по-определению" является только для внешнего мира, да и то только в отношении завершения-отката. А внутри же самой транзакции она очень даже делимая, для того и существуют "Transaction Savepoints". Поэтому внутри транзакции можно делать частичные откаты при том, что вся транзакция завершена. Т.е.: делаем шаги 1, 2, 3, отменяем до начала шага 2, делаем шаг 4.
BEGIN TRANSACTION T
--делаем шаг 1
SAVE TRANSACTION T1
--делаем шаг 2
...
--делаем шаг 3
ROLLBACK TRANSACTION T1
--делаем шаг 4
COMMIT TRANSACTION T

Результат: шаг 1, шаг 4.
Это нормальная ситуация.
А вопрос в том, может ли откат к T1 быть произведён из триггера. По моему мнению - да. Формально этому препятствий нет.
...
Рейтинг: 0 / 0
Откат в триггере?
    #32018412
Исключительно, чтобы помочь (конечно же, не из злобы
). Ну, в плане того, что если нелогичность в приложении имеет место быть, то лучше подправить логику, чем танцевать от ложных предпосылок, которые могут в итоге завести в тупик.

Совет об использовании SAVEPOINT вроде бы бесполезен, так как для реализации этого перед инсертом необходимо прописать "SAVE TRANSACTION", где проще поставить IF, не допускающий операции INSERT по какому-то условию. Скорее всего, Дмитрий не имеет возможности это сделать (например, код процедуры не его), иначе вопрос бы вообще не возник. А раз так, то он не имеет возможности прописать и SAVE TRANSACTION. Если я в этом не прав, позвольте мне съесть свой галстук.
...
Рейтинг: 0 / 0
Откат в триггере?
    #32018419
Владимир Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так и я, чтобы помочь, и тоже не из злобы .
Поскольку никто, кроме самого автора вопроса, не знает всех обстоятельств проблемы, а они, обстоятельства, могут быть достаточно сложны, чтобы их расписывать в вопросе, то можно или их домысливать, или принимать вопрос как он есть.
Я, ставя себя на место вопрошающего, предпочёл бы услышать хотя бы один (а лучше несколько) из вариантов решения моей проблемы. Или убедиться, что проблема, как она есть, нерешаема. А если же на мой вопрос будет много ответов, но исходящих из собственных домыслов отвечающих, меня бы это не обрадовало. Это всё равно что на вопрос "сколько времени", мне все рядом стоящие начнут рассказывать, какие существуют способы решить мою проблему раз и навсегда. Так я и сам знаю, что лучший способ - иметь при себе часы .
...
Рейтинг: 0 / 0
Откат в триггере?
    #32018631
Hibernate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A ROLLBACK trigger не подойдет?
...
Рейтинг: 0 / 0
Откат в триггере?
    #32018635
> Rollback Trigger
А разве MS SQL это умеет?
Sybase точно умеет.
...
Рейтинг: 0 / 0
Откат в триггере?
    #32018636
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В MSSQL нет такого понятия. Поэтому откатится вся внешняя транзакция, а не только действия, сделанные в триггере.
...
Рейтинг: 0 / 0
Откат в триггере?
    #32018638
Владимир Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вынужден повториться.
При выполнении ROLLBACK TRANSACTION ABCD, ВСЯ внешняя транзакция откатится ТОЛЬКО если не было
SAVE TRANSACTION ABCD.
Иначе откат произойдёт то точки ABCD, но внешняя транзакция НЕ откатится и выполнение BATCH-а будет продолжено.
...
Рейтинг: 0 / 0
Откат в триггере?
    #32018740
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Garya Привилегированный пользователь
Участник
Самый правильный ответ (правда, и самый короткий) дал Andrey. Правда, почему-то он как-то остался в стороне обсуждения. Instead-триггер - вот что вам нужно.
...
Рейтинг: 0 / 0
Откат в триггере?
    #32018772
Владимир Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Instead-триггер - вещь безусловно полезная, но это не панацея от всех проблем.
Например: производятся изменения в таблице Т1. При этом, для реализации логики, триггер на Т1 производит изменение в Т2. Но у Т2 тоже есть триггер, производящий изменения, возможно довольно сложные. Но данные в Т2 связаны с Т1, их нельзя изменить, не изменив предварительно Т1. А в триггере Т1 проверяется результат изменений в Т2, и в случае невыполнения каких либо условий - откат.
Так вот, для реализации подобной логики в Instead-триггере придётся в него поместить не изменение Т2 с последующей проверкой, а сымитировать весь процесс изменений Т1 и Т2, включая логику триггера Т2, проанализировать результаты и принимать решение. В результате, для подобных случаев, применение Instead-триггера может потребовать значительных усилий по переделке и усложнению логики, и станет нецелесообразным.
Когда-же ситуация проще и корректность изменений легко определяется до их внесения, лучше, разумеется, применить Instead-триггер.
Какова ситуация у Дмитрия Русановского неизвестно, поэтому только он (Дмитрий Русановский) может решить, какой вариант для него лучше.
...
Рейтинг: 0 / 0
Откат в триггере?
    #32018872
Hibernate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал RollBack Trigger - действительно нету, ошиПка говоритЬ... странно все это: очень нужная весЧь. Что самое странное, так это то, что в книжке "Использование Microsoft SQL Server 7.0 Специальное издание." Стефана Винкопа (издательство Вильямс, 1999) даже такой раздел есть (стр.420-421) и очень все классно расписано... Я в растерянных чувствах... Два месяца проектировал БД, в планах реализации много чего было основано именно на RollBack Trigger... И что, теперь опять изголяться?... достало!!!
...
Рейтинг: 0 / 0
Откат в триггере?
    #32018879
"В печь её!" Этот автор - полный кретин. В указанной книге СТОЛЬКО несуразностей! А в своей предыдущей книге по sql6.5, с которой он почти вслепую скопировал 90% в книгу по sql7.0, он на полном серьезе утверждал о наличии каскадных обновлений в sql6.5. То же самое, естественно, он утверждает и в книге по 7.0. "ROLLBACK TRIGGER" - это, конечно, вершина его перлов.
...
Рейтинг: 0 / 0
Откат в триггере?
    #32018883
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Garya Привилегированный пользователь
Участник
Всем количеством своих конечностей поддерживаю Глеба! Когда я читал книгу по версии 7.0, я был просто ошеломлен некомпетентностью автора. Слишком бросается в глаза, что автор даже не удосужился ознакомиться с новыми возможностями версии 7.0, в том числе с теми, которые изменяют стратегические возможности SQL-сервера, технологию его администрирования и разработки БД. В частности, автор весьма уверенно заявляет, что в данной версии всего два вида архивирования - полное и журнала транзакций. Сразу видно, что, о новом виде разностного архивирования он просто не в курсе. Ограничения на размер записи, полей разных типов и т.п. приведены от версии 6.5. О двух новых видах репликации - Merge и непосредственно обновляемых подписчиках - ни гу-гу. Тоже не успел, видимо, сам об этом почитать. Какого черта тогда взялся за публикацию книги о новой версии, если сам о ней ничерта не знаешь? Вопрос, в общем-то, риторический.... Меня просто поразила наглость автора, который осмелился с такими знаниями вылезать в свет с публикацией книги. Видимо, жутко жадный до денег и совести - ни грамма.
...
Рейтинг: 0 / 0
Откат в триггере?
    #32018945
Hibernate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а в 2000 SQL этот самый RallBack Trigger или что-то вроде этого есть? - мне еще не поздно перекочевать...
...
Рейтинг: 0 / 0
Откат в триггере?
    #32018964
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Garya Привилегированный пользователь
Участник
Есть просто Rollback, который откатывает триггер и все внешние транзакции, в которые вложена транзакция триггера.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Откат в триггере?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]