![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с запросом [D7, MSSQL]
VadimSpb © (2006-08-16 19:58:00)Добрый день!
Выполняю следующий запрос в программе обновления БД:
if tb_Name.IndexOf('Addresses')<>-1 then // Читаем список названий полей
ElementConnection.GetFieldNames('Addresses',pl_Name);
if pl_Name.IndexOf('PostIndexID')=-1 then
begin // Создаем поле PostIndexID
ADOCommand.CommandText := 'ALTER TABLE Addresses ADD PostIndexID int';
ADOCommand.Execute;
ADOCommand.CommandText := 'UPDATE Addresses SET PostIndexID=1';
ADOCommand.Execute;
end;
Иногда получается интересный результат: поле создается, а заполняется 1 только 80-90% всех записей !
Иногда все отрабатывает нормально. В чем м.б. причина?
Desdechado (2006-08-18 11:18:00) [1]> недоучившийся студент (разработчик) даже не может понять что там не только 7 должно быть
О кривых руках я говорил уже. И лучше распрямить руки десятку разработчиков, чем сотням "типа админов".
Естественно, и среди админов попадаются толковые, как и среди разрабов - дятлы. Но статистика - вещь упрямая.
PS под юзерами я подразумевал не кноподавов, а заказчиков у разработчиков (т.е. и админов, раскиданных со своими пользователями по миру). Они друг о друге могут и не знать вовсе.
User_Name (2006-08-17 19:45:00) [2]2 Desdechado © (17.08.06 19:15) [27]
Да-да конечно, тот самый админ (мы же про MSSQL говорим) который сидит ниже по умолчанию не сможет запустить скрипт и т.д и т.п. проходили уже тоже, а тот недоучившийся студент (разрабюотчик ..........) который пишет подобные (пример) скрипты
..
elsif substr(p_account_no,1,4) in ('3400')
then
return '7';
..
и запихивающий это в ехе даже не может понять что там не только 7 должно быть, а потом месячная отчетность падает
И юзеров у меня гораздо брльше чем 1-2 :)
И база в 26 Гиг (не много но все-таки)
Desdechado (2006-08-17 19:15:00) [3]мое имхо:
Если пользователю дать скрипт, то, согласно законам Мерфи (подтверждающимися моим 10-летним опытом), они его запустят не так, не тогда или не в том порядке.
Доведение до юзера патча в виде EXE с одной кнопкой самая, имхо, разумная затея, если не хочешь сидетьпотом с каждым индивидуально и разгребать гигабайтовые БД, порченые кривыми руками пользователей.
Они, как водится, сначала что-то делают, а потом думают.
Так что если у вас 1-2 юзера, ваш подход имеет право на жизнь. Но когда их многие сотни-тысячи по всему миру, я вас пожалею...
User_Name (2006-08-17 19:09:00) [4]2 Desdechado © (17.08.06 18:12) [25]
Скажу еще раз свое ИМХО (не более того), как пользователь, который использует ту хрень, которую пишут разработчики (уже 12 лет).
Я привел ранее огрызок ПРАВИЛЬНОГО скрипта, где можно задавать имя таблицы, поля (в оригинале еще тип и значения) и т.п.
Это ИМХО правильных подход. В таком случае мне спускают не тот самый кумулятивный, интеллектуальный и т.п. патч. а скрипт типа
exec ....
И это правильно.
Все вышесказанное естессно ИМХО.
Desdechado (2006-08-17 18:12:00) [5]Патч - понятие растяжимое. И руки у всех разные.
Если патч сделать:
1. кумулятивным, т.е. включающим всю последовательность изменений от начала времен
2. интеллектуальным, т.е. он сам определяет текущее состояние и необходимость апдейта
3. со встроенной скриптогонялкой, т.е. не использующим внешние средства и не насилующим пользователя
то все выполняется легко, быстро и всегда актуален в единственном числе.
User_Name (2006-08-17 14:56:00) [6]2 Desdechado © (17.08.06 14:13) [22]
Вот - вот проходил (и к сожалению прохожу сейчас). Патч где-то под метр, который выполняет пару тривиальных команд, которые проще скриптом сделать, потом оказывается, что он что-то делает не то, и приходится качать второй патч ....
evvcom (2006-08-17 14:27:00) [7]> [20] Desdechado © (17.08.06 13:34)
> - либо лень писать длинный скрипт, проще было сделать цикл
> по системной вьюхе
Я обычно из нее получаю имена, кидаю в Excel, там формирую наглядно скрипт и копирую в скриптодвижок. Мне так проще
Desdechado (2006-08-17 14:13:00) [8]такое пишется не в клиенте, а в специальных утилитах обслуживания (патчах, например)
либо, при особой лени, выполняется в виде скрипта во встроенных в СУБД сприптогонялках
User_Name (2006-08-17 13:56:00) [9]Ну да, а писать в клиенте тоже самое видимо нормально. Н-да уж.
Desdechado (2006-08-17 13:34:00) [10]> МОЖНО сделать через ХП
но НЕ нужно!
Надобность менять метаданные возникает редко. Менять их через такую задницу у меня возникала 2 раза и по моей же вине, когда было:
- либо лень писать длинный скрипт, проще было сделать цикл по системной вьюхе
- либо надо было написать общий случай для заранее неизвестных системных имен индексов
VadimSpb (2006-08-17 13:31:00) [11]
> Val © (17.08.06 12:08) [17]
Согласен, так и надо делать. Обновление влияет на целостность данных и при ошибках лучше делать откат с выдачей сообщения.
Всем спасибо!
User_Name (2006-08-17 13:20:00) [12]2 Desdechado © (17.08.06 11:19) [12]
То, что он хочет МОЖНО сделать через ХП
... (Кусок реально работающей ХП. Влом было переписывать под даннный случай :) )
EXEC('ALTER TABLE '+@TempTableName+' ADD ' + @FiledName + ' Int DEFAULT 1')
SELECT @SQL='UPDATE '+@TempTableName + ' SET ' + @FiledName + '=1 '
EXEC(@SQL)
...
Какие проблемы ???
Val (2006-08-17 12:08:00) [13]тогда в коде :
1. явный старт транзакции
2. апдейт
3. коммит, при исключении - роллбэк.
VadimSpb (2006-08-17 11:51:00) [14]
> Val © (17.08.06 11:29) [15]
В этой таблице триггеров нет.
Val (2006-08-17 11:29:00) [15]триггеры не могут влиять? в подобных случаях все триггеры на таблицу перед апдейтом отключают, после - включают.
VadimSpb (2006-08-17 11:25:00) [16]
> Desdechado © (17.08.06 11:19) [12]
Проблема основная в том, что нет закономерности. В большинстве случаев все отрабатывает как надо, без ошибок.
VadimSpb (2006-08-17 11:21:00) [17]
> Вообще, то я бы вынес всю эту байду в отдельную ХП.
Зачем держать в БД процедуру, которая д.б. выполнена только один раз?
ИМХО, это решение из области философии :-))
> во время обновления БД у вас к ней монопольный доступ?
Все производится локально. Больше с БД никто не работает.
В базе более 10000 записей, новые не добавляются.
Desdechado (2006-08-17 11:19:00) [18]> я бы вынес всю эту байду в отдельную ХП.
А что, в ХП можно менять метаданные?!
> Иногда получается интересный результат
Триггеры активны? Что в них? Может, они препятствуют обновлению, не вызывая исключений.
Val (2006-08-17 10:47:00) [19]>[2] VadimSpb (16.08.06 20:21)
я понимаю, что вы пытаетесь сделать.
я говорю о том, что возможно, после того, как вы сделали апдейт таблицы, пользователи успевают добавить новые записи, где это поле не заполнено.
вы проверяете таблицу и удивляетесь...
все-таки ответьте - во время обновления БД у вас к ней монопольный доступ?
Val (2006-08-17 10:43:00) [20]>[8] User_Name (16.08.06 20:56)
вот...зачем?