Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с запросом [D7, MSSQL]


Страницы:   1 2

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)
вот...зачем?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо