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

Откуда:
Сообщений: 4
Исходная ситуация:
В БД заливается некий скрипт. Пусть он состоит из множества самых различных команд (DML, DDL).
При выполнении очередной команды возникает ошибка. Нужно разделить скрипт на части - выполненную и закомиченную (это то что реально уже есть в базе) и невыполненную.
Проблема состоит в выделении именно выполненной части, т.к. среди выполненных ранее команд могут оказаться и незакомиченные. А некоторые команды (такие как alter table ...) вызывают commit автоматически после их выполнения. Поэтому, после выполнения каждой команды скрипта нужно определить попали ли изменения в базу.
Предполагаемый вариант решения - анализ сегмента отката после выполнения каждой очередной команды.
У каго есть готовые варианы решения задачи по анализу сегмента для определения состояния транзакции? Или другие решения...
Заранее спасибо!
12 сен 08, 12:16    [6178018]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать выполнен ли commit используя сегмент отката  [new]
pravednik
Member

Откуда: Jacksonville, FL
Сообщений: 16268
stegan
Исходная ситуация:
В БД заливается некий скрипт. Пусть он состоит из множества самых различных команд (DML, DDL).
При выполнении очередной команды возникает ошибка. Нужно разделить скрипт на части - выполненную и закомиченную (это то что реально уже есть в базе) и невыполненную.
Проблема состоит в выделении именно выполненной части, т.к. среди выполненных ранее команд могут оказаться и незакомиченные. А некоторые команды (такие как alter table ...) вызывают commit автоматически после их выполнения. Поэтому, после выполнения каждой команды скрипта нужно определить попали ли изменения в базу.
Предполагаемый вариант решения - анализ сегмента отката после выполнения каждой очередной команды.
У каго есть готовые варианы решения задачи по анализу сегмента для определения состояния транзакции? Или другие решения...
Заранее спасибо!

путаете мягкое и теплое
и до выполнения
12 сен 08, 12:19    [6178036]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать выполнен ли commit используя сегмент отката  [new]
sqlplus
Member

Откуда: sql+
Сообщений: 641
stegan
Исходная ситуация:
В БД заливается некий скрипт. Пусть он состоит из множества самых различных команд (DML, DDL).
При выполнении очередной команды возникает ошибка. Нужно разделить скрипт на части - выполненную и закомиченную (это то что реально уже есть в базе) и невыполненную.
Проблема состоит в выделении именно выполненной части, т.к. среди выполненных ранее команд могут оказаться и незакомиченные. А некоторые команды (такие как alter table ...) вызывают commit автоматически после их выполнения. Поэтому, после выполнения каждой команды скрипта нужно определить попали ли изменения в базу.
Предполагаемый вариант решения - анализ сегмента отката после выполнения каждой очередной команды.
У каго есть готовые варианы решения задачи по анализу сегмента для определения состояния транзакции? Или другие решения...
Заранее спасибо!



Трассировку сессии делаешь, смотришь трейс и видишь на чём валится.
12 сен 08, 12:19    [6178039]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать выполнен ли commit используя сегмент отката  [new]
Elic
Member

Откуда:
Сообщений: 29988
stegan
Поэтому, после выполнения каждой команды скрипта нужно определить попали ли изменения в базу.
Зачем определять? Просто делай явный commit.
12 сен 08, 12:25    [6178082]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать выполнен ли commit используя сегмент отката  [new]
RA\/EN
Member

Откуда:
Сообщений: 3659
Ленивые прогеры пошли... Пишите скрипты так, чтобы их можно было прогонять повторно.
Для тестовых баз как вариант - floashback database.
1. s.sql:
connect / as sysdba
select dbms_flashback.get_system_change_number SCN from dual;
disconnect
2. Запоминаем цифирь.
3. Прогоняем скрипт. Он упал посередине.
4. r.sql
connect / as sysdba
shutdown abort
startup mount
undef scn
flashback database to scn &scn;
alter database open resetlogs;
Вводим цифирь из п.2.
5. Правим скрипт, см. п.1 (хотя можно п.2 использовать повторно).
12 сен 08, 14:51    [6179198]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать выполнен ли commit используя сегмент отката  [new]
stegan
Member

Откуда:
Сообщений: 4
Узнавать нужно!
Крупная компания. Скрипты пишут одни, а льют - другие люди.
Поэтому, после заливки скрипта нужно ткнуть разработчику в то место скрипта, до которого все изменения оказались зафиксированы. Обратного пути (отката) нет.
Пока я нашел такой вариант решения

select cr_get
from v$transaction a, v$session b
where a.ADDR=b.TADDR
and b.SID = (select sid from v$mystat where rownum=1);

если количество записей = 0 - то выполненная команда зафиксирована.
12 сен 08, 14:56    [6179233]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать выполнен ли commit используя сегмент отката  [new]
stax..
Guest
имхо фигня все ето
1) скрипт должен документировать свое выполнение
2) если компания крупная то писать прикладнуху наката скриптов
.....
stax
12 сен 08, 15:27    [6179457]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать выполнен ли commit используя сегмент отката  [new]
stegan
Member

Откуда:
Сообщений: 4
как раз ее и пишем !
12 сен 08, 15:50    [6179628]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать выполнен ли commit используя сегмент отката  [new]
stegan
Member

Откуда:
Сообщений: 4
как раз ее и пишем !
12 сен 08, 16:05    [6179755]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать выполнен ли commit используя сегмент отката  [new]
expla
Guest
Зачем такие сложности?
Пусть скрипт сохраняет в некой специальной таблице № шага к которому приступает. Если транзакция фиксируется, номер № шага сохраниться (это будет означать, что шаг выполнен), если откатывается, то откатывается и № шага, тогда скрипт нужно перезапустить с первого невыполненного шага.

С DDL ситуация несколько сложнее, поскольку транзакция сначала фиксируется, затем выполняется изменение БД. Однако, обычно DDL можно безопасно выполнять повторно и игнорировать исключения связанные с тем, что DDL уже отработал ранее. В общем для DDL нужно различать, выполняется он впервые, тогда все исключения нужно обрабатывать, или повторно, тогда некоторые исключения нужно игнорировать.
12 сен 08, 16:05    [6179759]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать выполнен ли commit используя сегмент отката  [new]
RA\/EN
Member

Откуда:
Сообщений: 3659
stegan
Узнавать нужно!
Крупная компания. Скрипты пишут одни, а льют - другие люди.
Поэтому, после заливки скрипта нужно ткнуть разработчику в то место скрипта, до которого все изменения оказались зафиксированы. Обратного пути (отката) нет.

И это у Вас случается на продуктиве? Тестеров нет? Стенды для тестирования влом делать?
Бедная большая компания...
А то, что при полупробежавлим скрипте, по большому счету, база находится в логически неконсистентном состоянии, Вас не смущает? Пока разработчика почешется, пока исправит скрипт... Большая компания сидит без дела
Учитесь писать скрипты. Для особо ленивых есть такая команда в sqlplus - SPOOL назвается. В ней командой PROMPT и показывайте прогресс.
12 сен 08, 18:19    [6180442]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить