Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Откат изменений  [new]
laifik
Member

Откуда:
Сообщений: 190
Меня интересует можно ли сделать откат изменений в таблице после вставки с помощью Insert into?
24 окт 05, 16:55    [1999601]     Ответить | Цитировать Сообщить модератору
 Re: Откат изменений  [new]
Местный писатель
Member

Откуда: СССР
Сообщений: 198
ROLLBACK TRAN
24 окт 05, 16:56    [1999619]     Ответить | Цитировать Сообщить модератору
 Re: Откат изменений  [new]
Glory
Member

Откуда:
Сообщений: 104760
Отменить можно НЕзавершенные трнанзакции.
24 окт 05, 16:57    [1999624]     Ответить | Цитировать Сообщить модератору
 Re: Откат изменений  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Если под откатом иметь ввиду ROLLBACK TRAN, то надо чтоб был BEGIN TRAN.
24 окт 05, 16:57    [1999628]     Ответить | Цитировать Сообщить модератору
 Re: Откат изменений  [new]
WiRuc
Member

Откуда: Воронеж
Сообщений: 1280
pkarklin
Если под откатом иметь ввиду ROLLBACK TRAN, то надо чтоб был BEGIN TRAN.

Скажем, ROLLBACK в триггере допустим и без явного BEGIN TRAN, как в самом триггере, так и во внешнем скрипте. А есть еще и IMPLICIT транзакции:)
24 окт 05, 17:08    [1999689]     Ответить | Цитировать Сообщить модератору
 Re: Откат изменений  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
ОФФ.

Хех. Судя по всему, перекачка данных
https://www.sql.ru/forum/actualthread.aspx?tid=227471
удалась...
24 окт 05, 17:35    [1999908]     Ответить | Цитировать Сообщить модератору
 Re: Откат изменений  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
WiRuc
pkarklin
Если под откатом иметь ввиду ROLLBACK TRAN, то надо чтоб был BEGIN TRAN.

Скажем, ROLLBACK в триггере допустим и без явного BEGIN TRAN, как в самом триггере, так и во внешнем скрипте. А есть еще и IMPLICIT транзакции:)


Я готов с Вами подискутировать на предмет ROLLBACK TRAN без явного BEGIN TRAN ;), но здесь, IMHO, не тот случай. И я выразил туже мысль, тока с помощью инструкций, что и Glory.
24 окт 05, 17:38    [1999939]     Ответить | Цитировать Сообщить модератору
 Re: Откат изменений  [new]
Местный писатель
Member

Откуда: СССР
Сообщений: 198
GreenSunrise
ОФФ.

Хех. Судя по всему, перекачка данных
https://www.sql.ru/forum/actualthread.aspx?tid=227471
удалась...


:::
24 окт 05, 18:11    [2000178]     Ответить | Цитировать Сообщить модератору
 Re: Откат изменений  [new]
laifik
Member

Откуда:
Сообщений: 190
Перекачка данных удалась!
А про транзакцию я много читала. Но сделать ее на SQL мне не удавалось. Только средствами Билдера.
24 окт 05, 19:43    [2000415]     Ответить | Цитировать Сообщить модератору
 Re: Откат изменений  [new]
laifik
Member

Откуда:
Сообщений: 190
Я понимаю, что нужно написать примерно по такой схеме:
автор
begin tran
insert into table2 (f1, f2, f3) select f1, f2, f3 from table1 where ...
commit tran

И, естественно, запрос работает.
Допустим, с помощью insert into я вставила записи в другую таблицу. Ошибочно. Хочу отменить свое действие. Кнопка "Отменить" будет иметь событие отмены. Что я должна написать в этом событии? Или я должна использовать команду Билдера. А уже begin Tran и commit Tran обеспечат эту отмену?
25 окт 05, 10:52    [2001449]     Ответить | Цитировать Сообщить модератору
 Re: Откат изменений  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2791
Если commit tran прошел, то никакая кнопка с rollback tran не поможет. А делать две кнопки для клиента "commit" и "rollback", чтобы дать ему время подумать нельзя, так как пока он думает, будет висеть открытая транзакция и возможны блокировки.
25 окт 05, 10:59    [2001501]     Ответить | Цитировать Сообщить модератору
 Re: Откат изменений  [new]
laifik
Member

Откуда:
Сообщений: 190
По моему, до меня дошло.
Если я правильно поняла, то одним запросом я вставляю значения в таблицу
автор
insert into table2 (f1, f2, f3) select f1, f2, f3 from table1 where ...

Если хочу отменить вставку, пишу такой же запрос, только использую конструкцию транзакции:
автор
begin Transaction
Declare @@Err int
insert into table2 (f1, f2, f3) select f1, f2, f3 from table1 where ...
if @@Err != 0
COMMIT Transaction
ELSE
ROLLBACK Transaction

Похоже, что так?
25 окт 05, 11:12    [2001578]     Ответить | Цитировать Сообщить модератору
 Re: Откат изменений  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2791
Обычно begin - commit - rollback tran применяются, если нужно произвести изменения в нескольких таблицах одновременно или ни в одной из них. Если ошибка произойдет в одиночном insert, то для нее rollback выполнится автоматически. Еще посмотрите в BOL про @@error.
Если же прошел commit и обнаружилась ошибка, то "откатывать" вставку придется путем банального удаления неправильных записей.
25 окт 05, 11:47    [2001830]     Ответить | Цитировать Сообщить модератору
 Re: Откат изменений  [new]
laifik
Member

Откуда:
Сообщений: 190
Я привела одиночную вставку, чтобы уменьшить текст запроса. А так у меня используется вставку двух связанных записей.
25 окт 05, 12:08    [2001972]     Ответить | Цитировать Сообщить модератору
 Re: Откат изменений  [new]
Prolog
Member

Откуда: Москва
Сообщений: 2791
Тогда можно так:

declare @err int
begin tran
  insert ...
  set @err = @@error; if @@err <> 0 goto end_tran
  update ...
  set @err = @@error; if @@err <> 0 goto end_tran

end_tran:
if @err = 0 commit tran else rollback tran
25 окт 05, 12:22    [2002051]     Ответить | Цитировать Сообщить модератору
 Re: Откат изменений  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
если нет необходимости в дифференцировании реакции на ошибку в зависимости от инструкции, то достаточно будет:

SET XACT_ABORT ON
BEGIN TRAN
  INSERT Table1 ...
  INSERT Table2 ...
COMMIT TRAN
25 окт 05, 12:43    [2002202]     Ответить | Цитировать Сообщить модератору
 Re: Откат изменений  [new]
laifik
Member

Откуда:
Сообщений: 190
Спасибо огромное! У меня все получилось.
25 окт 05, 14:06    [2002840]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить