Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Базы данных > alter table дает warning, который в Delphi возвращается как raise


Автор: Voice 14.02.18, 22:30
на Дельфи7 через АДО пытаюсь добавить поле в таблицу базы MSSQL2000:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    with ADOQuery do
       begin
       SQL.Text := 'alter table Table1';
       SQL.Add('add Field123 varchar(255) NULL');
       ExecSQL;
       end;

Полей в таблице уже много и СКЛ выдает варнинг:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Warning: The table 'Table1' has been created but
    its maximum row size (54548) exceeds the
    maximum number of bytes per row (8060). INSERT or UPDATE of a row in this table will fail
    if the resulting row length exceeds 8060 bytes.


Но в дельфи на строке AdoQuery.ExecSQL вылезает RAISE.

Т.е. если выполнить этот запрос на самом СКЛе, то поле добавится. Ну и появится это сообщение с предупреждением о превышении кол-ва байт на запись.

Но почему в дельфи программа останавливается и поле не добавляется?
Подскажите, как или чем это победить?

Автор: Fr0sT 15.02.18, 07:04
Цитата Voice @
Но почему в дельфи программа останавливается и поле не добавляется?

Видимо, потому что компонент так реагирует на warning
Цитата Voice @
Подскажите, как или чем это победить?

Видимо, разве что изменением компонента

Автор: MIF 15.02.18, 09:08
Цитата Voice @
почему в дельфи программа останавливается и поле не добавляется?

Потомy что Management Studio использует Native SQL а не ADODB..

Цитата Voice @
Подскажите, как или чем это победить?

Из своей программы создай хранимую процедуру, которая добавляет нужное поле.
Выполни хранимую процедуру из своей программы.

Автор: Bas 16.02.18, 10:55
Цитата MIF @
Потомy что Management Studio использует Native SQL а не ADODB..

Точно? Если взять другого провайдера ?
Цитата MIF @
Выполни хранимую процедуру из своей программы.

И это будет правильно. Модификацию параметров таблиц лучше проводить на сервере а не на клиенте, и желательно "выкинуть" ВСЕХ активных пользователей...., а то проблем может быть гораздо больше...

Автор: Fr0sT 16.02.18, 11:12
Цитата Bas @
И это будет правильно. Модификацию параметров таблиц лучше проводить на сервере а не на клиенте, и желательно "выкинуть" ВСЕХ активных пользователей...., а то проблем может быть гораздо больше...

Что значит "проводить на сервере"? Залезть на сервер по удаленке? И чем это лучше?

Может, у ТС что-то типа админской софтины. А она должна уметь манипулировать метаданными без всяких костылей типа хранимок и прочего.

Автор: MIF 16.02.18, 14:00
Тогда софтину нвдо переписать на .NET языке. SqlConnection также использует NativeSql

Автор: LMM 16.02.18, 21:59
Цитата Fr0sT @
Что значит "проводить на сервере"? Залезть на сервер по удаленке? И чем это лучше?

Вообще-то при любых манипуляциях по изменению структуры данных реально работающей БД необходимо отключить всех её юзеров. А то можно и до дедлайна доиграцца.
Цитата Fr0sT @
Может, у ТС что-то типа админской софтины. А она должна уметь манипулировать метаданными без всяких костылей типа хранимок и прочего.
Ага, голимый код на клиентах, а на сервере - ни строчки бизнес-правил и админ парится из...как он там на MS SQL... Даррагая редакция...етс...
Цитата MIF @
Тогда софтину нвдо переписать на .NET языке
Радиус кривизны рук надо постараться к бесконечности приблизить, а не с бубном скакать. Независимо от языка и способа коннекта к БД.

Автор: Bas 17.02.18, 14:58
C бубном можно долго скакать...

Думаю что проблема не в "бубне" а в структуре таблиц.

Автор: Fr0sT 19.02.18, 07:21
Цитата LMM @
Вообще-то при любых манипуляциях по изменению структуры данных реально работающей БД необходимо отключить всех её юзеров.

"Отключить юзеров" и "проводить на сервере" это таки две большие разницы

Автор: LMM 19.02.18, 14:40
Цитата Fr0sT @
"Отключить юзеров" и "проводить на сервере" это таки две большие разницы

С точки зрения телодвижений админа БД - ДА! Я и не спорю.

Автор: Bas 21.02.18, 15:49
Цитата Fr0sT @

"Отключить юзеров" и "проводить на сервере" это таки две большие разницы

Таки Да.
Ex. Два(3,4,5...) пользователя пытаются проделать
Цитата Voice @
SQL.Add('add Field123 varchar(255) NULL');
ExecSQL;

Что будет в результате? DDL будет в шоке если совсем не упадет в "спячку" пытаясь разобраться с юзьверями которые пытались завершить транзакции в старую структуру и с теми которые хотят новую структуру таблицы..
DDL операции надобно проводить без активных пользователей.

Автор: LMM 21.02.18, 16:28
А что - кто-то на самом деле реально разрешает юзерам менять структуру базы? :whistle:

Автор: Bas 21.02.18, 18:47
Цитата LMM @
А что - кто-то на самом деле реально разрешает юзерам менять структуру базы?

На темплате таблицах можно, но используется ОЧЕНЬ даже очень РЕДКО , почти НИКОГДА. Это - чесать правой рукой левое ухо.

Добавлено
Хотя... это возможно но надо соблюдать определенные правила.

Автор: LMM 21.02.18, 19:20
Цитата Bas @
Это - чесать правой рукой левое ухо
Это очень мягко сказано! :D

Цитата LMM @
Хотя... это возможно но надо соблюдать определенные правила
Не-а, я на такое не пойду никогда. Потом гемору не оберёшься.

Автор: Bas 21.02.18, 21:11
Цитата LMM @
Цитата LMM @ Сегодня, 21:20
Хотя... это возможно но надо соблюдать определенные правила
Не-а, я на такое не пойду никогда. Потом гемору не оберёшься.

Тоже этого не понимаю. Но это можно, можно даже создать БД через
Цитата Voice @
ExecSQL
. Зачем? Это другой вопрос.

Автор: LMM 22.02.18, 03:56
Цитата Bas @
Зачем? Это другой вопрос.
Разве что - в учебных целях. Попробовать что ли создать оракловую базу скриптом? :D Со всеми причиндалами...

Автор: MIF 22.02.18, 05:21
Цитата LMM @
Разве что - в учебных целях.


Мир огромен и разнообразен. Ни oдин человек не может об’ять и понять все детали мира.

ЗЫ: MS распространяет апгрейты своего продукта Great Planes не путем передачи скриттов администраторам баз даннных клиентов, а путем рассылки экзешника, который выполняет DDL скрипты.

ЗЫЫ: Ето - как черный лебедь. Никто ме мог и подумать, что черные лебеди существуют, пока не открылы Австралию.

Автор: LMM 22.02.18, 06:15
Мож в холивары переберёмся? :popcorn:

Автор: Fr0sT 22.02.18, 07:02
Да уж, давайте без специфики отечественных форумов - человек спрашивает, как сделать X, а ему многословно доказывают, что он дурак :)

Автор: Bas 22.02.18, 19:46
Цитата Fr0sT @
Да уж, давайте без специфики отечественных форумов - человек спрашивает, как сделать X

Х это мало, возьмем Z. Мы предложили варианты.

Добавлено
Цитата Fr0sT @
что он дура

Это Форум, тут нет дураков ,тут есть общение ....

Автор: Voice 28.02.18, 16:50
уххх, понаписали :)

объясняю:
есть некий сервис, в котором появляются данные в xml-файлах.
моя софтина должна выкачивать новые файлы, формировать из них плоскую таблицу и заливать эти данные в одну большую таблицу фактов для олап-куба.

так вот. В этих xml-файлах иногда появляются лишние поля (атрибуты). На всякий случай (для будущих реализаций) эти поля добавляются в т.фактов.
И при попытке добавить поле, появляется варнинг от СКЛя, который вызывает исключение в приложении. Об этом и была создана эта тема.

Автор: Bas 28.02.18, 18:32
Цитата Voice @
Об этом и была создана эта тема.


Цитата Voice @
на Дельфи7 через АДО пытаюсь добавить поле в таблицу базы MSSQL2000:

Где внешний источник? Даже намека нет на xml источника ADO(ActiveX Data Objects).
Вот и ответы.

Автор: Fr0sT 01.03.18, 07:00
Цитата Bas @
Где внешний источник? Даже намека нет на xml источника ADO(ActiveX Data Objects).

Я так понял, у него нет именно источника xml, просто читает. Потому и не упоминал

Автор: ^D^ima 01.03.18, 09:43
Voice
Я в базе от MS в Business Contact Manager видел такой пример:
Они сделали заранее лишних 50 полей, в другой таблице названия этих полей и кол-во используемых. И если нужно новое поле,они физически не изменяет базу.

Автор: LMM 01.03.18, 10:57
Цитата ^D^ima @
Они сделали заранее
Всё лучше, чем по живому менять структуру!

Автор: MIF 01.03.18, 11:08
Добавь таблицу с тремя полями: айди записи в первой таблице, имя тега, содержание тега. Все неоые теги можно туда записывать без необходимости изменять структуру на ходу.
А новые поля можно добавлять по результатам анализа содержания таблицы. Если тегипоявился один раз, то его можно проигнорировать, а если часто, то включить в основную таблицу.

Автор: Bas 03.03.18, 20:58
Цитата LMM @
Всё лучше, чем по живому менять структуру!

+++++

Цитата ^D^ima @
Они сделали заранее лишних 50 полей

Зачем??? Вы не помните когда 256М это было "счастье"
Цитата ^D^ima @
И если нужно новое поле,они физически не изменяет базу.

Если надо больше параметров , чем Выше изложеннон?

Автор: ^D^ima 04.03.18, 05:22
Больше 50 кастомных полей не разрешается

Автор: Voice 04.03.18, 10:04
Цитата Bas @
Где внешний источник? Даже намека нет на xml источника ADO(ActiveX Data Objects).
Вот и ответы.


Цитата Fr0sT @
Я так понял, у него нет именно источника xml, просто читает. Потому и не упоминал

правильно. Xml я обрабатываю сам.
Потом формирую запрос вида:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    insert into (...)
    select 'qwe', 'rty'...

этот запрос уходит через ADO. Если я вижу лишнее поле, то пытаюсь его добавить (ессно ПЕРЕД вставкой данных). Ну и там вываливается вышеописанная ошибка.

Цитата MIF @
Добавь таблицу с тремя полями: айди записи в первой таблице, имя тега, содержание тега. Все неоые теги можно туда записывать без необходимости изменять структуру на ходу.

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

LkpFields:
idFieldName
1Field1
2Field2
......


MainTbl
RowIdFieldIdAValue
11aaa
12bbb
21ccc


Да, я думал так сделать. Но тогда имеем гемор с получением плоских данных (таблица фактов) для олап-куба.
Т.е. преобразовать можно, но получим вышеописанные проблемы с добавлением кучи новых полей.

Т.е. на выходе мы все равно должны получить плоскую таблицу. Так проще это делать сразу.

Автор: LMM 04.03.18, 11:45
Цитата Voice @
на выходе мы все равно должны получить плоскую таблицу
Или результат запроса из мастер-таблицы и связанных с ней данных в ещё каких-то таблицах.

Автор: Voice 04.03.18, 12:48
Цитата LMM @
Или результат запроса из мастер-таблицы и связанных с ней данных в ещё каких-то таблицах.

че? вообще не понял

Автор: MIF 04.03.18, 19:45
Voice,а чем подход с хранимой процедурой не устроил?

Автор: Fr0sT 05.03.18, 07:06
В свете задачи вариант с заранее зарезервированными полями кажется более разумным, хотя и потребует некоторых дополнительных действий по сопоставлению безликих полей конкретным атрибутам. Если же говорить о сабже, то совет прежний - либо изменить исходники компонента, либо попробовать другой компонент.

Автор: Bas 07.03.18, 20:30
Цитата ^D^ima @
Они сделали заранее лишних 50 полей, в другой таблице названия этих полей и кол-во используемых.

Скромный вопрос. Зачем???

Автор: ^D^ima 09.03.18, 06:45
В программе есть настраиваемые поля пользователя. Мы можем на разные формы добавить до 50 кастомных полей. Очень удобно между прочем

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)