Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: DDL внутри транзакции  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
ASCRUS
Я знаю что такое секционированные представления. Мне интересует обоснование применения DDL внутри транзакций с возможностью отката, Вы же вроде это называете "фичей" ?


И так. Имеем секционированное представление, где данные в базовые таблицы раскладываются по месяцам. В последний день месяца мне надо создать новую таблицу со всеми необходимыми аттрибутами и модифицировать представление. Вы прекрасно понимаете, что это будет ряд DDL инструкций. Так почему бы мне не включить эти инструкции в транзакцию? Ибо если (не дай бог) чей-то збойнет между созданием таблицы и изменением представления, то в принципе получится несоглассованость с тем, что хотелось получить. А потом, почему бы в джоб этот скриптик не загнать?

ЗЫ. Я изначально не хотел, чтоб из этого топика выросла такая ругань, но меня вынуждают высказывания типа "проблема в бесмыслености" от тех, кто не иммет такой возможности. Раз звезды зажигают, значит это кому-то нужно. И возможности завертывания DDL в транзакцию можно найти практическое применение.
4 фев 05, 15:13    [1300855]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Лох Позорный
pkarklin
А мне надо просто создать табличку и малость альтернуть представление.

А зачем в транзакции? Да еще в транзакции, где всякий DML используется?


Если Вы про пример автора топика, то может быть практического смысла в этом и нет.
4 фев 05, 15:14    [1300861]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
Лох Позорный
А зачем в транзакции? Да еще в транзакции, где всякий DML используется?

Мне ни разу не требовалось запускать скрипты с DDL-инструкциями по расписанию. Но вот возможность использовать DDL и DML инструкции в одной транзакции часто была необходима. В транзакции - для того чтобы если возникли непредвиденные проблемы откатить все изменения, а не разбираться что прошло а что нет.
4 фев 05, 15:18    [1300885]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
Yo!
Guest
автор

Вообще-то любой пользователь, имеющий соответствующие привилегии (а они прописаны в часто предоставляемых ролях CONNECT, RESOURCE) может делать в СВОЕЙ схеме все что угодно


речь идет о боевом сервере к которому доступ дается из отдельной комнаты и толь с санкции CIO и естественно не по сети.

автор

И так. Имеем секционированное представление, где данные в базовые таблицы раскладываются по месяцам. В последний день месяца мне надо создать новую таблицу со всеми необходимыми аттрибутами и модифицировать представление. Вы прекрасно понимаете, что это будет ряд DDL инструкций. Так почему бы мне не включить эти инструкции в транзакцию? Ибо если (не дай бог) чей-то збойнет между созданием таблицы и изменением представления, то в принципе получится несоглассованость с тем, что хотелось получить. А потом, почему бы в джоб этот скриптик не загнать?


не нужно слабость чего-то sql диалекта сваливать на здоровую голову, чтоб создать итоговые таблицы ddl никому не нужны.

автор

Но вот возможность использовать DDL и DML инструкции в одной транзакции часто была необходима.


а можно в кратце описать что за задача и что за необходимость ?
4 фев 05, 15:30    [1300947]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
andsm
Мне ни разу не требовалось запускать скрипты с DDL-инструкциями по расписанию. Но вот возможность использовать DDL и DML инструкции в одной транзакции часто была необходима. В транзакции - для того чтобы если возникли непредвиденные проблемы откатить все изменения, а не разбираться что прошло а что нет.

Есть такая славная и удобная штука - исключения называются. Для того и созданы, чтобы обрабатывать ошибки. А транзакции вообще то не для того сделаны, чтобы DDL откатывать.
4 фев 05, 15:40    [1300993]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Yo!
не нужно слабость чего-то sql диалекта сваливать на здоровую голову, чтоб создать итоговые таблицы ddl никому не нужны.


Еще раз. если Вы соблаговолите еще раз перечитать топик (и не только этот), то может быть увидите, что "с больной головы на здоровую" я не сваливал. а просто пытался объяснить, что возможность завернуть DDL инструкции в транзакцию не такая уж и бесполезная фича. А вот Ваши эмоции явно бьют через край.
4 фев 05, 15:42    [1301010]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
Yo!
а можно в кратце описать что за задача и что за необходимость ?

Создаю таблицу, в том же скрипте заполняю ее нужными данными, в том числе переносом из других таблиц. Меняю другие таблицы - например, дропаю там поле из которого на предыдущем шаге перенес данные в другое место. Повторяю этот процесс еще несколько раз, с другими таблицами.
Представим что это делалось бы не транзакции, и где-то что-то упало. Что получится? Часть таблиц изменена, часть нет. Где-то данные перенесены, где-то нет. Новая версия программы работать не может, и старая версия тоже не работает.
4 фев 05, 15:44    [1301025]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
gardenman
Member

Откуда: С-Петербург
Сообщений: 2347
если рассматривать структуру базы данных как проект, который подвержен частым изменениям (в процессе сопровождения, разработки) когда база выходит в тираж и у разных заказчиков разные версии, очевидно что согласование нужно делать скриптами, обрабатывать ошибки и т.д. В этом случае очень полезно иметь возможность откатить транзакцию с ДДЛ в случае неудачи, чтобы не зависнуть между "переходами" с одной версии на другую. Никто не утверждает, что без этого жить невозможно. Просто - дополнительная удобная фича.
4 фев 05, 15:46    [1301032]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
ASCRUS
Есть такая славная и удобная штука - исключения называются.


Интересно, что проще:

try
  CREATE TABLE ...
  ALTER VIEW..
catch
  DROP TABLE
end

или

SET XACT_ABORT ON
BEGIN TRAN
  CREATE TABLE ...
  ALTER VIEW..
COMMIT TRAN 


ASCRUS
А транзакции вообще то не для того сделаны, чтобы DDL откатывать.


Хм... по определению Транзакция - последовательность операций, выполняемых как единый логический блок, обладающий 4 свойствами ACID(Atomicity, Consistency, Isolation и Durability). и я не вижу никаких противоречий при включении в тот блок DDL инструкций. IMHO.
4 фев 05, 15:51    [1301054]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
Yo!
Guest
ok, задачу придумали - обновление софта. но надеюсб мы договорились что за изсенения в боевом режиме нада вырывать яйца ?

обновления делается скриптами - например пачсеты для оракла, они модифицируют словарь субд. сначало идут DDL потом DML. если вырубается DML посередине ... чтож выясняем почему тут вариантов особо нет проблема может быть только в инстансе или просто место кончилось. чиним запускаем снова где-то видим варнинге где-то нет, но ничего страшного от сбоя посередине не будет. этой технологии десятки лет.
4 фев 05, 15:54    [1301069]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
Yo!
сначало идут DDL потом DML

Это часто неудобно. Часто нужно выполнить сначала DDL, затем DML, потом DDL и так несколько раз. Понятно что можно это переписать чтобы сначала был только DDL и лишь затем только DML, но это требует дополнительной работы.
4 фев 05, 17:08    [1301346]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
AAron
Member

Откуда: Москва
Сообщений: 4324
Из-за чего спор, непонятно.

В административной работе, при установке каких либо обновлений, изменений схемы данных с сохранением (или модификацией) данных "умение" сервера обрабатываеть DDL внутри транзакции упрощает жизнь.

На боевых серверах в штатных ситуациях не приходится делать таких извращений, по крайней мере мне.

Но, имхо, наличие такой возможности - это неплохо.
4 фев 05, 17:43    [1301485]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
Yo!
Guest
andsm

Это часто неудобно. Часто нужно выполнить сначала DDL, затем DML, потом DDL и так несколько раз. Понятно что можно это переписать чтобы сначала был только DDL и лишь затем только DML, но это требует дополнительной работы.


у меня не тиражная система поэтому чесно говоря в жизни не писал таких скриптов и мне сложно представить что это за неудобство ... но OEBS пока справляется с этими неудобствами :)
4 фев 05, 17:55    [1301528]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
Sad Spirit
Member

Откуда:
Сообщений: 569
хм. не затерялось бы в глубинах флейма, но на всякий случай для PostgreSQL:
Добро пожаловать в psql 7.4.5 - Интерактивный Терминал PostgreSQL.

Наберите:  \copyright для условий распространения
           \h для подсказки по SQL командам
           \? для подсказки по внутренним slash-командам (\команда)
           \g или ";" для завершения и выполнения запроса
           \q для выхода

test=# begin;
BEGIN
test=# create table ddltest(id integer);
CREATE TABLE
test=# insert into ddltest values (1);
INSERT 151159 1
test=# select * from ddltest;
 id
----
  1
(1 запись)

test=# rollback;
ROLLBACK
test=# select * from ddltest;
ERROR:  relation "ddltest" does not exist
test=#
4 фев 05, 18:57    [1301671]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
gardenman
Member

Откуда: С-Петербург
Сообщений: 2347
2 Sad Spirit OK! принято!...
7 фев 05, 10:12    [1303696]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
just_me
Guest
gardenman
Возник вопрос, в каких базах данных кроме DB2 возможен DDL внутри транзакции? Для Oracle - понятно - всякий DDL вызовет коммит, который приведет к завершению транзакции. Sybase ASE - просто не позволяет DDL внутри транзакции. А как в остальных базах, ASA,MSSQL,POSTGRES и пр? для примера на DB2:


BOL по ASE:

ddl in tran
Setting ddl in tran to true allows these commands to be used inside a
user-defined transaction:
• alter table (clauses other than partition and unpartition are allowed)
• create default
• create index
• create procedure
• create rule
• create schema
• create table
• create trigger
• create view
• drop default
• drop index
• drop procedure
• drop rule
• drop table
• drop trigger
• drop view
• grant
• revoke

P.S> Кстати кто юзает Реп. Сервер, тот знает что для реплики именно вызовов (не результатов работы) процедур, чего-то там создающие, без этой опции не обойтись.
8 фев 05, 21:00    [1309114]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
Константин Лисянский
Member

Откуда: Москва
Сообщений: 902
Вы правда так проектируете БД или просто прикалываетесь ? Может поделитесь опытом, в каких ситуациях может понадобиться динамическое создание и изменения таблиц, индексов, и представлений ?


Процедуры преобразования данных для их загрузки в хранилище данных.
Ничего необычного. Просто, насколько я понимаю, все тут занимаются транзакционными системами, в которых, наверное, не очень желательно изменять на ходу структуру таблиц. При загрузке хранилища данных динамически создаётся большое количество временных и не очень временных таблиц, обеспечение целостности при этом тоже никто не отменял. Так что, такое свойство СУБД имеет достаточно оснований на существование.

По поводу динамического пересоздания вьюх - та же тема. Хранилища данных. Допустим, Вам нужно загрузить в здоровенную таблицу данные. Процесс занимает, скажем, 20 минут. Вы хотите, чтобы в это время польователи имели возможность выполнять отчёты. Один из приёмов - создаётся новая таблица, по структуре аналогичная той, в которую льются данные. Поверх старой создаётся вьюха, к ней пользователи делают запросы пока данные заливаются в новую таблицу (все данные из старой плюс новая порция) как только данные залились в новую таблицу вьюха перекидывается на неё в этой же транзакции. Старая таблица удаляется. Получаем возможность выполнения запросов пока в таблицу льются данные. Соответственно, если данные не залились нормально, то и вьюху не надо пересоздавать чтобы целостность не нарушить.

С индексами, наверное, не так всё, поскольку их наличие или отсутствие не влияет на целостность, а только на производительность. Хотя, не исключаю, что и для индексов можно найти пример.


Что касается поддержки этого в СУБД Teradata, то операция DDL должна быть последней в транзакции:

Teradata Database SQL Reference. Statement and Transaction Processing
If an explicit transaction contains a DDL statement, then it must be the last statement in the transaction.
The system enforces the rule that a DDL (Data Definition Language) statement must be the last statement of a transaction.


С уважением,
Константин Лисянский
http://lissianski.narod.ru
8 фев 05, 23:52    [1309299]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
Yo!
Guest
автор
По поводу динамического пересоздания вьюх - та же тема. Хранилища данных. Допустим, Вам нужно загрузить в здоровенную таблицу данные. Процесс занимает, скажем, 20 минут. Вы хотите, чтобы в это время польователи имели возможность выполнять отчёты.


сурово :) вот только в оракле опять же так не нужно извращатся чтоб получить консистентный отчет ...
9 фев 05, 00:18    [1309321]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
AAron
Member

Откуда: Москва
Сообщений: 4324
2Yo
Я думаю, что задача немного в другом. Не "обеспечить выполнение отчетов по вливаемым данным", а "обеспечить выполнение отчетов по старым данным, пока добавляются новые данные". По крайней мере такая ситуация представима. Кстати, у Константина на сайте есть переведенные советы Ральфа Кимбала, и там в частности обсуждается вопрос загрузки информации в хранилище. А оригинал здесь

2Константин Лисянский
Константин, приведенной цитаты очевидно, что при наличии DDL выражения, оно должно быть последним. А если их несколько? Разрешена ли такая ситуация?
9 фев 05, 00:35    [1309333]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
Yo!
Guest
2AAron

у версионного механизма писатели не мешают читателям, читатели не мешают писателям, поэтому получить читателю консистентный отчет ничто помешать не может, только затянуть конкуренция за cpu&i/o, но тут опять же тривиально решаем задачу приоритетами.
9 фев 05, 01:18    [1309355]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
AAron
Member

Откуда: Москва
Сообщений: 4324
2 Yo
я знаю, как работает версионный механизм. спасибо :) Речь была не об этом.
9 фев 05, 09:52    [1309670]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
gardenman
Member

Откуда: С-Петербург
Сообщений: 2347
2 Just Me
use data
go

select @@version
go

begin tran 
go

create table test (id int)
go

Adaptive Server Enterprise/12.5.0.3/EBF 10980 ESD#1/P/Linux Intel/Linux 2.4.18-18.7.xsmp i686/rel12503/1919/32-bit/OPT/Mon Mar 24 20:49:12 2003     
(1 row affected)

Server Message:  Number  2762, Severity  16
Server 'osago', Line 1:
The 'CREATE TABLE' command is not allowed within a multi-statement transaction in the 'data' database. 
                                                                                                           
9 фев 05, 10:25    [1309787]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
Константин Лисянский
Member

Откуда: Москва
Сообщений: 902
AAron
Я думаю, что задача немного в другом. Не "обеспечить выполнение отчетов по вливаемым данным", а "обеспечить выполнение отчетов по старым данным, пока добавляются новые данные". По крайней мере такая ситуация представима.


Ну, не только представима, но и вполне реально встречалась в моей практике.

AAron
Константин, приведенной цитаты очевидно, что при наличии DDL выражения, оно должно быть последним. А если их несколько? Разрешена ли такая ситуация?


Боюсь, что нет:

Teradata Database SQL Reference. Data Definition Statements
Rules for
• A DDL statement cannot be combined with other statements as part of a multistatement request.
• A DDL statement can only be included in an explicit transaction (one or more requests bracketed by BEGIN/END TRANSACTION statements) if it is one of the following:
• the only statement in the transaction, or
• structured as a single-statement request that appears as the last request in the transaction.
• In ANSI session mode, a DDL statement can only be included in a transaction when it is the last single-statement request before the COMMIT statement.


С уважением,
Константин Лисянский
http://lissianski.narod.ru
9 фев 05, 11:06    [1309972]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67469
Блог
Константин Лисянский
Может поделитесь опытом, в каких ситуациях может понадобиться динамическое создание и изменения таблиц, индексов, и представлений ?

Процедуры преобразования данных для их загрузки в хранилище данных.

Хм. Честно говоря, пока что ощутил такую потребность только на уровне создания партиций. Если рассмотреть Ваш пример с загрузкой на ходу - это будет ALTER TABLE...EXCHANGE PARTITION. Но ключевой момент в этом случае - вряд ли есть причины "не коммитить" этот DDL.
9 фев 05, 11:12    [1309997]     Ответить | Цитировать Сообщить модератору
 Re: DDL внутри транзакции  [new]
gardenman
Member

Откуда: С-Петербург
Сообщений: 2347
Если я правильно понял, принципе в Teradata ситуация такая же как в Оракле. DDL наверно неявно завершает транзакцию коммитом?
9 фев 05, 11:14    [1310003]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Сравнение СУБД Ответить