powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / DDL внутри транзакции
25 сообщений из 52, страница 2 из 3
DDL внутри транзакции
    #32901608
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSЯ знаю что такое секционированные представления. Мне интересует обоснование применения DDL внутри транзакций с возможностью отката, Вы же вроде это называете "фичей" ?

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

ЗЫ. Я изначально не хотел, чтоб из этого топика выросла такая ругань, но меня вынуждают высказывания типа "проблема в бесмыслености" от тех, кто не иммет такой возможности. Раз звезды зажигают, значит это кому-то нужно. И возможности завертывания DDL в транзакцию можно найти практическое применение.
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32901611
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лох Позорный pkarklinА мне надо просто создать табличку и малость альтернуть представление.
А зачем в транзакции? Да еще в транзакции, где всякий DML используется?

Если Вы про пример автора топика, то может быть практического смысла в этом и нет.
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32901631
andsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лох ПозорныйА зачем в транзакции? Да еще в транзакции, где всякий DML используется?
Мне ни разу не требовалось запускать скрипты с DDL-инструкциями по расписанию. Но вот возможность использовать DDL и DML инструкции в одной транзакции часто была необходима. В транзакции - для того чтобы если возникли непредвиденные проблемы откатить все изменения, а не разбираться что прошло а что нет.
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32901669
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
автор
Вообще-то любой пользователь, имеющий соответствующие привилегии (а они прописаны в часто предоставляемых ролях CONNECT, RESOURCE) может делать в СВОЕЙ схеме все что угодно


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

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


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

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


а можно в кратце описать что за задача и что за необходимость ?
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32901704
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andsmМне ни разу не требовалось запускать скрипты с DDL-инструкциями по расписанию. Но вот возможность использовать DDL и DML инструкции в одной транзакции часто была необходима. В транзакции - для того чтобы если возникли непредвиденные проблемы откатить все изменения, а не разбираться что прошло а что нет.
Есть такая славная и удобная штука - исключения называются. Для того и созданы, чтобы обрабатывать ошибки. А транзакции вообще то не для того сделаны, чтобы DDL откатывать.
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32901720
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo!не нужно слабость чего-то sql диалекта сваливать на здоровую голову, чтоб создать итоговые таблицы ddl никому не нужны.

Еще раз. если Вы соблаговолите еще раз перечитать топик (и не только этот), то может быть увидите, что "с больной головы на здоровую" я не сваливал. а просто пытался объяснить, что возможность завернуть DDL инструкции в транзакцию не такая уж и бесполезная фича. А вот Ваши эмоции явно бьют через край.
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32901729
andsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo!а можно в кратце описать что за задача и что за необходимость ?
Создаю таблицу, в том же скрипте заполняю ее нужными данными, в том числе переносом из других таблиц. Меняю другие таблицы - например, дропаю там поле из которого на предыдущем шаге перенес данные в другое место. Повторяю этот процесс еще несколько раз, с другими таблицами.
Представим что это делалось бы не транзакции, и где-то что-то упало. Что получится? Часть таблиц изменена, часть нет. Где-то данные перенесены, где-то нет. Новая версия программы работать не может, и старая версия тоже не работает.
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32901735
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если рассматривать структуру базы данных как проект, который подвержен частым изменениям (в процессе сопровождения, разработки) когда база выходит в тираж и у разных заказчиков разные версии, очевидно что согласование нужно делать скриптами, обрабатывать ошибки и т.д. В этом случае очень полезно иметь возможность откатить транзакцию с ДДЛ в случае неудачи, чтобы не зависнуть между "переходами" с одной версии на другую. Никто не утверждает, что без этого жить невозможно. Просто - дополнительная удобная фича.
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32901748
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSЕсть такая славная и удобная штука - исключения называются.

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

Код: plaintext
1.
2.
3.
4.
5.
try
  CREATE TABLE ...
  ALTER VIEW..
catch
  DROP TABLE
end

или

Код: plaintext
1.
2.
3.
4.
SET XACT_ABORT ON
BEGIN TRAN
  CREATE TABLE ...
  ALTER VIEW..
COMMIT TRAN 


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

Хм... по определению Транзакция - последовательность операций, выполняемых как единый логический блок, обладающий 4 свойствами ACID(Atomicity, Consistency, Isolation и Durability). и я не вижу никаких противоречий при включении в тот блок DDL инструкций. IMHO.
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32901759
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
ok, задачу придумали - обновление софта. но надеюсб мы договорились что за изсенения в боевом режиме нада вырывать яйца ?

обновления делается скриптами - например пачсеты для оракла, они модифицируют словарь субд. сначало идут DDL потом DML. если вырубается DML посередине ... чтож выясняем почему тут вариантов особо нет проблема может быть только в инстансе или просто место кончилось. чиним запускаем снова где-то видим варнинге где-то нет, но ничего страшного от сбоя посередине не будет. этой технологии десятки лет.
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32901975
andsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo!сначало идут DDL потом DML
Это часто неудобно. Часто нужно выполнить сначала DDL, затем DML, потом DDL и так несколько раз. Понятно что можно это переписать чтобы сначала был только DDL и лишь затем только DML, но это требует дополнительной работы.
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32902064
AAron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из-за чего спор, непонятно.

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

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

Но, имхо, наличие такой возможности - это неплохо.
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32902094
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
andsm
Это часто неудобно. Часто нужно выполнить сначала DDL, затем DML, потом DDL и так несколько раз. Понятно что можно это переписать чтобы сначала был только DDL и лишь затем только DML, но это требует дополнительной работы.

у меня не тиражная система поэтому чесно говоря в жизни не писал таких скриптов и мне сложно представить что это за неудобство ... но OEBS пока справляется с этими неудобствами :)
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32902203
Sad Spirit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм. не затерялось бы в глубинах флейма, но на всякий случай для PostgreSQL:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Добро пожаловать в 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=#
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32903474
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Sad Spirit OK! принято!...
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32907014
just_me
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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> Кстати кто юзает Реп. Сервер, тот знает что для реплики именно вызовов (не результатов работы) процедур, чего-то там создающие, без этой опции не обойтись.
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32907161
Константин Лисянский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы правда так проектируете БД или просто прикалываетесь ? Может поделитесь опытом, в каких ситуациях может понадобиться динамическое создание и изменения таблиц, индексов, и представлений ?

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

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

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


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

Teradata Database SQL Reference. Statement and Transaction ProcessingIf 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
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32907177
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
авторПо поводу динамического пересоздания вьюх - та же тема. Хранилища данных. Допустим, Вам нужно загрузить в здоровенную таблицу данные. Процесс занимает, скажем, 20 минут. Вы хотите, чтобы в это время польователи имели возможность выполнять отчёты.

сурово :) вот только в оракле опять же так не нужно извращатся чтоб получить консистентный отчет ...
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32907187
AAron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Yo
Я думаю, что задача немного в другом. Не "обеспечить выполнение отчетов по вливаемым данным", а "обеспечить выполнение отчетов по старым данным, пока добавляются новые данные". По крайней мере такая ситуация представима. Кстати, у Константина на сайте есть переведенные советы Ральфа Кимбала, и там в частности обсуждается вопрос загрузки информации в хранилище. А оригинал здесь

2Константин Лисянский
Константин, приведенной цитаты очевидно, что при наличии DDL выражения, оно должно быть последним. А если их несколько? Разрешена ли такая ситуация?
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32907200
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
2AAron

у версионного механизма писатели не мешают читателям, читатели не мешают писателям, поэтому получить читателю консистентный отчет ничто помешать не может, только затянуть конкуренция за cpu&i/o, но тут опять же тривиально решаем задачу приоритетами.
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32907450
AAron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Yo
я знаю, как работает версионный механизм. спасибо :) Речь была не об этом.
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32907529
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Just Me
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
use data
go

select @@version
go

begin tran 
go

create table test (id int)
go

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
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. 
                                                                                                           
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32907651
Константин Лисянский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AAronЯ думаю, что задача немного в другом. Не "обеспечить выполнение отчетов по вливаемым данным", а "обеспечить выполнение отчетов по старым данным, пока добавляются новые данные". По крайней мере такая ситуация представима.

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

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

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

Teradata Database SQL Reference. Data Definition StatementsRules 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
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32907669
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Лисянский Может поделитесь опытом, в каких ситуациях может понадобиться динамическое создание и изменения таблиц, индексов, и представлений ?
Процедуры преобразования данных для их загрузки в хранилище данных.
Хм. Честно говоря, пока что ощутил такую потребность только на уровне создания партиций. Если рассмотреть Ваш пример с загрузкой на ходу - это будет ALTER TABLE...EXCHANGE PARTITION. Но ключевой момент в этом случае - вряд ли есть причины "не коммитить" этот DDL.
...
Рейтинг: 0 / 0
DDL внутри транзакции
    #32907674
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понял, принципе в Teradata ситуация такая же как в Оракле. DDL наверно неявно завершает транзакцию коммитом?
...
Рейтинг: 0 / 0
25 сообщений из 52, страница 2 из 3
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / DDL внутри транзакции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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