Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Откат в триггере? / 21 сообщений из 21, страница 1 из 1
03.12.2001, 16:20
    #32018352
Откат в триггере?
День добрый.

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

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

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

Отказать в жёсткой форме!
(С) Советская бюрократия
...
Рейтинг: 0 / 0
04.12.2001, 10:31
    #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
04.12.2001, 11:26
    #32018412
Откат в триггере?
Исключительно, чтобы помочь (конечно же, не из злобы
). Ну, в плане того, что если нелогичность в приложении имеет место быть, то лучше подправить логику, чем танцевать от ложных предпосылок, которые могут в итоге завести в тупик.

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


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