Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Пакеты инструкций внутри транзакции  [new]
Звег
Guest
Пишу скрипт на создание нескольких элементов БД, возникла необходимость распределения некоторых инструкций по отдельным пакетам (GO). В результате получаем примерно следующее :

SET ....
SET ....
SET ....
GO
BEGIN TRANSACTION
GO
СОЗДАЕМ ТАБЛИЦУ ....
GO
СОЗДАЕМ ИНДЕКСЫ ...
GO
СОЗДАЕМ ПРОЦЕДУРУ ....
GO
СОЗДАЕМ ТАБЛИЦУ 2
GO
COMMIT

В итоге имеем следующее : при ошибке на этапе создания первой таблицы он валится с созданием индексов по ней и с созданием процедуры которая обращается к ней, но при этом создает таблицу 2 и в конце ругается на то, что для commit нет begin transaction, то есть судя по всему после первой ошибки он делает rollback но продолжает выполнение остальных инструкций. В чем тогда вообще смысл такой транзакции ? Как сделать транзакцию неделимой, что бы при ошибке в любом пакете ролбэчило весь скрипт ?
23 май 11, 14:58    [10694711]     Ответить | Цитировать Сообщить модератору
 Re: Пакеты инструкций внутри транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
А как вы указали, что при отмене транзакции должно прерываться и выполнение всего скрипта ?
23 май 11, 15:00    [10694730]     Ответить | Цитировать Сообщить модератору
 Re: Пакеты инструкций внутри транзакции  [new]
Звег
Guest
А как это указать ? Я бы л уверен, что операторы begin transaction и commit автоматически делают все что между ними неделимой транзакцией, а оказывается что ошибка одного из пакетов go внтури откатывает все изменения текущей транзакции и дальнейшее выполненние пакетов происходит вне ее.
23 май 11, 15:04    [10694768]     Ответить | Цитировать Сообщить модератору
 Re: Пакеты инструкций внутри транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Звег
А как это указать ? Я бы л уверен, что операторы begin transaction и commit автоматически делают все что между ними неделимой транзакцией, а оказывается что ошибка одного из пакетов go внтури откатывает все изменения текущей транзакции и дальнейшее выполненние пакетов происходит вне ее.

SET XACT_ABORT
23 май 11, 15:08    [10694814]     Ответить | Цитировать Сообщить модератору
 Re: Пакеты инструкций внутри транзакции  [new]
Звег
Guest
И все равно, не помогает...после того как в одном из пакетов он встретил ошибку, делает ролбэк и продолжает выполнение остальных инструкций вне транзакции...
23 май 11, 15:26    [10694958]     Ответить | Цитировать Сообщить модератору
 Re: Пакеты инструкций внутри транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Звег
И все равно, не помогает...после того как в одном из пакетов он встретил ошибку, делает ролбэк и продолжает выполнение остальных инструкций вне транзакции...

Ну так это ваше клиентское приложение продолжает отправлять серверу команды после аварийного завершения текущего пакета
23 май 11, 15:30    [10694997]     Ответить | Цитировать Сообщить модератору
 Re: Пакеты инструкций внутри транзакции  [new]
Звег
Guest
Мое клиентское приложение - MS Managment Studio. Как мне в итоге объеденить неколько пакетов инструкций в одну неделимую транзакцию ? В чем вообщзе тогда смысл транзакций если отсутствует ее "неделимость" ?
23 май 11, 15:33    [10695015]     Ответить | Цитировать Сообщить модератору
 Re: Пакеты инструкций внутри транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Звег
Мое клиентское приложение - MS Managment Studio. Как мне в итоге объеденить неколько пакетов инструкций в одну неделимую транзакцию ? В чем вообщзе тогда смысл транзакций если отсутствует ее "неделимость" ?

Обрабатывать нужно результаты завершения пакетов
И не путать понятие транзакции с обработкой ошибок.
Сервер текущую транзакцию отменил
То, что вы продолжили после этого отсылку команд - это ваша проблема
23 май 11, 15:38    [10695053]     Ответить | Цитировать Сообщить модератору
 Re: Пакеты инструкций внутри транзакции  [new]
Звег
Guest
А зачем тогда вообще вводить инструкции BEGIN ... COMMIT ?
23 май 11, 15:43    [10695093]     Ответить | Цитировать Сообщить модератору
 Re: Пакеты инструкций внутри транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Звег
А зачем тогда вообще вводить инструкции BEGIN ... COMMIT ?

Для того, чтобы сначала читать руководства, а потом писать скрипты
23 май 11, 15:46    [10695121]     Ответить | Цитировать Сообщить модератору
 Re: Пакеты инструкций внутри транзакции  [new]
Звег
Guest
Огромное спасибо. На форум лезут что бы узнать конкретный ответ на конкретный вопрос, а не фразу читай мануал. Если не можете дать конкретный ответ то лучше ничего не говрить, чем говрить о некомпитентности задающего. Замечание вместо ответа не делает вас умнее.
23 май 11, 16:04    [10695273]     Ответить | Цитировать Сообщить модератору
 Re: Пакеты инструкций внутри транзакции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Звег
Огромное спасибо. На форум лезут что бы узнать конкретный ответ на конкретный вопрос, а не фразу читай мануал. Если не можете дать конкретный ответ то лучше ничего не говрить, чем говрить о некомпитентности задающего. Замечание вместо ответа не делает вас умнее.
У вас всех обострение что ли весеннее? То им не говори, хелп не посылай читать, то вас не делает умнее, се не делает...
23 май 11, 16:06    [10695283]     Ответить | Цитировать Сообщить модератору
 Re: Пакеты инструкций внутри транзакции  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Звег, на скуле кругом бесчувстенные и злые люди. Так что вам все-таки прийдется изучить инструкцию))). Поверьте, так будет проще и быстрее.
23 май 11, 16:07    [10695295]     Ответить | Цитировать Сообщить модератору
 Re: Пакеты инструкций внутри транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Звег
Огромное спасибо. На форум лезут что бы узнать конкретный ответ на конкретный вопрос, а не фразу читай мануал. Если не можете дать конкретный ответ то лучше ничего не говрить, чем говрить о некомпитентности задающего. Замечание вместо ответа не делает вас умнее.

Я и так уже умный, мне умнее не надо
А вы продолжайте вместо чтения документации получать знания на ощупь. Авось через несколько месяцев и нащупаете правду
Только сначала согласуйте свое понятие транзакции и пакета с оффициальными.
23 май 11, 16:09    [10695310]     Ответить | Цитировать Сообщить модератору
 Re: Пакеты инструкций внутри транзакции  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Варанты:
:on error exit
SET ....
SET ....
SET ....
GO
BEGIN TRANSACTION
GO
СОЗДАЕМ ТАБЛИЦУ ....
GO
СОЗДАЕМ ИНДЕКСЫ ...
GO
СОЗДАЕМ ПРОЦЕДУРУ ....
GO
СОЗДАЕМ ТАБЛИЦУ 2
GO
COMMIT
и выполнять скрипт через sqlcmd.

Либо
SET ....
SET ....
SET ....
set xact_abort on
GO
BEGIN TRANSACTION
GO
if @@trancount = 0
 return
СОЗДАЕМ ТАБЛИЦУ ....
GO
if @@trancount = 0
 return
СОЗДАЕМ ИНДЕКСЫ ...
GO
if @@trancount = 0
 return
СОЗДАЕМ ПРОЦЕДУРУ ....
GO
if @@trancount = 0
 return
СОЗДАЕМ ТАБЛИЦУ 2
GO
if @@trancount > 0
 COMMIT
23 май 11, 16:31    [10695480]     Ответить | Цитировать Сообщить модератору
 Re: Пакеты инструкций внутри транзакции  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ка на меня ,то гораздо проще писать скипты которые сами себя преряют...

if not exists(select 1 from sys.all_objects where id = object_id('Схема.Имя вашей таблицы','U'))
begin
   begin tran
    create table Схема.Имя вашей таблицы (.....)
  if @@error <> 0 
  begin
     if @@trancount <>0
       rollback tarn
     raiseeror(.......)
     return
  end
  if @@trancount <>0
    commit tran
end
GO
-- далее проверяем наличие индексов и пересоздаем
GO
-- далее тоже самое для процедуры

1. Можно запускать не 1 раз - отладка и все такое
2. Отсутвие ошибок класса - такой обьект уже есть
3. Короткие транзакции
4. Перед создание обьекта ,идет проверка на его существование ,и если нужно прописать удаление обьекта
23 май 11, 16:50    [10695702]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить