Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.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 |
Видимо, потому что компонент так реагирует на warning Видимо, разве что изменением компонента |
Автор: MIF 15.02.18, 09:08 |
Потомy что Management Studio использует Native SQL а не ADODB.. Из своей программы создай хранимую процедуру, которая добавляет нужное поле. Выполни хранимую процедуру из своей программы. |
Автор: Bas 16.02.18, 10:55 |
Точно? Если взять другого провайдера ? И это будет правильно. Модификацию параметров таблиц лучше проводить на сервере а не на клиенте, и желательно "выкинуть" ВСЕХ активных пользователей...., а то проблем может быть гораздо больше... |
Автор: Fr0sT 16.02.18, 11:12 |
Цитата Bas @ И это будет правильно. Модификацию параметров таблиц лучше проводить на сервере а не на клиенте, и желательно "выкинуть" ВСЕХ активных пользователей...., а то проблем может быть гораздо больше... Что значит "проводить на сервере"? Залезть на сервер по удаленке? И чем это лучше? Может, у ТС что-то типа админской софтины. А она должна уметь манипулировать метаданными без всяких костылей типа хранимок и прочего. |
Автор: MIF 16.02.18, 14:00 |
Тогда софтину нвдо переписать на .NET языке. SqlConnection также использует NativeSql |
Автор: LMM 16.02.18, 21:59 |
Вообще-то при любых манипуляциях по изменению структуры данных реально работающей БД необходимо отключить всех её юзеров. А то можно и до дедлайна доиграцца. Цитата Fr0sT @ Ага, голимый код на клиентах, а на сервере - ни строчки бизнес-правил и админ парится из...как он там на MS SQL... Даррагая редакция...етс...Может, у ТС что-то типа админской софтины. А она должна уметь манипулировать метаданными без всяких костылей типа хранимок и прочего. Радиус кривизны рук надо постараться к бесконечности приблизить, а не с бубном скакать. Независимо от языка и способа коннекта к БД. |
Автор: Bas 17.02.18, 14:58 |
C бубном можно долго скакать... Думаю что проблема не в "бубне" а в структуре таблиц. |
Автор: Fr0sT 19.02.18, 07:21 |
Цитата LMM @ Вообще-то при любых манипуляциях по изменению структуры данных реально работающей БД необходимо отключить всех её юзеров. "Отключить юзеров" и "проводить на сервере" это таки две большие разницы |
Автор: LMM 19.02.18, 14:40 |
С точки зрения телодвижений админа БД - ДА! Я и не спорю. |
Автор: Bas 21.02.18, 15:49 |
Таки Да. Ex. Два(3,4,5...) пользователя пытаются проделать Что будет в результате? DDL будет в шоке если совсем не упадет в "спячку" пытаясь разобраться с юзьверями которые пытались завершить транзакции в старую структуру и с теми которые хотят новую структуру таблицы.. DDL операции надобно проводить без активных пользователей. |
Автор: LMM 21.02.18, 16:28 |
А что - кто-то на самом деле реально разрешает юзерам менять структуру базы? |
Автор: Bas 21.02.18, 18:47 |
На темплате таблицах можно, но используется ОЧЕНЬ даже очень РЕДКО , почти НИКОГДА. Это - чесать правой рукой левое ухо. Добавлено Хотя... это возможно но надо соблюдать определенные правила. |
Автор: LMM 21.02.18, 19:20 |
Это очень мягко сказано! Не-а, я на такое не пойду никогда. Потом гемору не оберёшься. |
Автор: Bas 21.02.18, 21:11 |
Цитата LMM @ Цитата LMM @ Сегодня, 21:20 Хотя... это возможно но надо соблюдать определенные правила Не-а, я на такое не пойду никогда. Потом гемору не оберёшься. Тоже этого не понимаю. Но это можно, можно даже создать БД через . Зачем? Это другой вопрос. |
Автор: LMM 22.02.18, 03:56 |
Разве что - в учебных целях. Попробовать что ли создать оракловую базу скриптом? Со всеми причиндалами... |
Автор: MIF 22.02.18, 05:21 |
Мир огромен и разнообразен. Ни oдин человек не может об’ять и понять все детали мира. ЗЫ: MS распространяет апгрейты своего продукта Great Planes не путем передачи скриттов администраторам баз даннных клиентов, а путем рассылки экзешника, который выполняет DDL скрипты. ЗЫЫ: Ето - как черный лебедь. Никто ме мог и подумать, что черные лебеди существуют, пока не открылы Австралию. |
Автор: LMM 22.02.18, 06:15 |
Мож в холивары переберёмся? |
Автор: Fr0sT 22.02.18, 07:02 |
Да уж, давайте без специфики отечественных форумов - человек спрашивает, как сделать X, а ему многословно доказывают, что он дурак |
Автор: Bas 22.02.18, 19:46 |
Цитата Fr0sT @ Да уж, давайте без специфики отечественных форумов - человек спрашивает, как сделать X Х это мало, возьмем Z. Мы предложили варианты. Добавлено Это Форум, тут нет дураков ,тут есть общение .... |
Автор: Voice 28.02.18, 16:50 |
уххх, понаписали объясняю: есть некий сервис, в котором появляются данные в xml-файлах. моя софтина должна выкачивать новые файлы, формировать из них плоскую таблицу и заливать эти данные в одну большую таблицу фактов для олап-куба. так вот. В этих xml-файлах иногда появляются лишние поля (атрибуты). На всякий случай (для будущих реализаций) эти поля добавляются в т.фактов. И при попытке добавить поле, появляется варнинг от СКЛя, который вызывает исключение в приложении. Об этом и была создана эта тема. |
Автор: Bas 28.02.18, 18:32 |
Где внешний источник? Даже намека нет на xml источника ADO(ActiveX Data Objects). Вот и ответы. |
Автор: Fr0sT 01.03.18, 07:00 |
Я так понял, у него нет именно источника xml, просто читает. Потому и не упоминал |
Автор: ^D^ima 01.03.18, 09:43 |
Voice Я в базе от MS в Business Contact Manager видел такой пример: Они сделали заранее лишних 50 полей, в другой таблице названия этих полей и кол-во используемых. И если нужно новое поле,они физически не изменяет базу. |
Автор: LMM 01.03.18, 10:57 |
Всё лучше, чем по живому менять структуру! |
Автор: MIF 01.03.18, 11:08 |
Добавь таблицу с тремя полями: айди записи в первой таблице, имя тега, содержание тега. Все неоые теги можно туда записывать без необходимости изменять структуру на ходу. А новые поля можно добавлять по результатам анализа содержания таблицы. Если тегипоявился один раз, то его можно проигнорировать, а если часто, то включить в основную таблицу. |
Автор: Bas 03.03.18, 20:58 |
+++++ Зачем??? Вы не помните когда 256М это было "счастье" Если надо больше параметров , чем Выше изложеннон? |
Автор: ^D^ima 04.03.18, 05:22 |
Больше 50 кастомных полей не разрешается |
Автор: Voice 04.03.18, 10:04 | ||||||||||||||||||||
Цитата Bas @ Где внешний источник? Даже намека нет на xml источника ADO(ActiveX Data Objects). Вот и ответы. правильно. Xml я обрабатываю сам. Потом формирую запрос вида: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> insert into (...) select 'qwe', 'rty'... этот запрос уходит через ADO. Если я вижу лишнее поле, то пытаюсь его добавить (ессно ПЕРЕД вставкой данных). Ну и там вываливается вышеописанная ошибка. Цитата MIF @ Добавь таблицу с тремя полями: айди записи в первой таблице, имя тега, содержание тега. Все неоые теги можно туда записывать без необходимости изменять структуру на ходу. в смысле, держать не плоскую таблицу, а ... длинную? (хз, как оно по-научному называется) т.е. будет справочник полей и таблица с данными? LkpFields:
MainTbl
Да, я думал так сделать. Но тогда имеем гемор с получением плоских данных (таблица фактов) для олап-куба. Т.е. преобразовать можно, но получим вышеописанные проблемы с добавлением кучи новых полей. Т.е. на выходе мы все равно должны получить плоскую таблицу. Так проще это делать сразу. |
Автор: LMM 04.03.18, 11:45 |
Или результат запроса из мастер-таблицы и связанных с ней данных в ещё каких-то таблицах. |
Автор: 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 кастомных полей. Очень удобно между прочем |