powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Внесение изменений в БД при апдейте приложения.
38 сообщений из 38, показаны все 2 страниц
Внесение изменений в БД при апдейте приложения.
    #39168848
Mironico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Наконец я добрался до автоапдейта программы.
С апдейтом самой программы особых вопросов не возникает
а вот как лучше вносить изменения в БД хотел спросить
опытных людей.

До сих пор обновлялся вручную:
1. Менял exe
2. Сравнивал старую и новую базы в IBExpert.

Теперь количество торговых точек выросло и делать так
стало долго и затруднительно.

Тут я лично вижу 2 пути:
1. Держаться версий программы, т.е. хранить версии баз (пустых, только метаданные) и посылать в обновлении ехе+скрипт.
2. Посылать пустую эталонную базу сравнивать и вносить изменения на месте.

Прошу совета.
Заранее спасибо.

ПыСы. Версия Firebird к моменту запуска будет 2.5.5 (без вариантов).
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39168853
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Второй - не вариант.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39168854
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Mironico!
You wrote on 11 февраля 2016 г. 17:46:48:

Mironico> 2. Посылать пустую эталонную базу сравнивать и вносить изменения на месте.
не взлетит
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39168858
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mironico,

иногда путей больше двух.

чистая БД + средство перекачки с предыдущей версии.
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39168863
Mironico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pastorMironico,

иногда путей больше двух.

чистая БД + средство перекачки с предыдущей версии.

Геморно имхо
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39168869
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Mironico!
You wrote on 11 февраля 2016 г. 17:59:19:

Mironico> Геморно имхо
скажи лучше "не умею"
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39168879
Mironico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мимопроходящий,

"Средство перекачки" уже есть или самому выдумывать?
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39168882
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mironico,

Можно отсылать не эталонную БД, а набор скриптов, которые обеспечивают апдейт метаданных до нужной версии.
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39168889
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Mironico!
You wrote on 11 февраля 2016 г. 18:11:36:

Mironico> "Средство перекачки" уже есть или самому выдумывать?
на этом можно ставить точку.
задача решения не имеет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39168893
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+1 насчет набора обновляющих скриптов. В которых кроме изменения метаданных также удобно обновлять данные (эталонные справочники, новые дефолтные значения полей и прочее).
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39168903
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, кстати, давнее обсуждение темы. Не знаю, что к нему можно добавить.
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39168921
ZeroMQ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mironico,

В данных базы храни номер версии структуры. В коде приложения - тоже.
Если первый номер больше второго - обновляешь приложение. Если наоборот - обновляешь структуру базы.
Для обновления структуры коннектишься в монопольном режиме и последовательно, от версии к версии накатываешь скрипты обновления. Которые ты заранее оттестировал. В начале каждой итерации обповления в базу пишешь: "начато обновление структуры 12->13". По успешному завершению этапа итерации эту пометку удаляешь.
"Смыть, повторить."
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39168939
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZeroMQВ начале каждой итерации обповления в базу пишешь: "начато обновление
структуры 12->13".
И главное - не забыть сделать бекап перед началом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39168942
ZeroMQ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovZeroMQВ начале каждой итерации обповления в базу пишешь: "начато обновление
структуры 12->13".
И главное - не забыть сделать бекап перед началом.

Естественно... :)
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39168945
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

,...и восстановить его :-)
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39168950
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochDimitry Sibiryakov,

,...и восстановить его :-)
... если что-то пошло не так. В противном случае - отложить в сторонку.
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39169004
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster,

проверочно восстанавливать fbk надо всегда, иначе зачем он нужен?
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39169009
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

Ну это как бы по умолчанию - те, кто этого не делает- те еще камикадзе.
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39169031
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне кажется, основная проблема обновлений - это пропуск части обновлений.
Взять, к примеру, 1с. Обновления конфигурации там выходят по разу в неделю, и это реально задалбывает.
Однако если на версии 4 пропускаешь обновления 5, 6, 7, то есть варианты
1. обновлятор должен определить, с какой версии делается обновление, и по очереди применить пропущенные
2. обновлятор должен уметь обновлять базу с любыми пропусками. т.е. с 4 на 8 - выполнить одноразовое обновление.

Вроде бы обновлятор 1с работает как раз по второй схеме. Но для 1с 7.7 были случаи, когда после наката обновлений с пропусками получался какой-то звездец, который непонятно было как расколупать даже с "табличным" хранением данных в этой версии.

Впрочем, 1с - это ведь "платформа". То есть, это скорее обновление данных, чем метаданных. Поэтому должно быть проще, чем с конкретной прикладной системой.
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39169036
fb user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovZeroMQВ начале каждой итерации обповления в базу пишешь: "начато обновление
структуры 12->13".
И главное - не забыть сделать бекап перед началом.

Не универсально. Есть большие базы.
Универсально - накатывать изменения в одной транзакции, включая структуру и данные.
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39169039
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fb user,

расскажи это Оракулу, у которого любой DDL неявно в транзакцию оборачивается
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39169042
fb user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денисfb user,

расскажи это Оракулу, у которого любой DDL неявно в транзакцию оборачивается
Сравнивать нужно не с Oracle, а с тем как оно наиболее юзабельно.
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39169047
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fb userЕсть большие базы.
Их вообще никогда не обновляют. Тем более - автоматически.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39169052
fb user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakovfb userЕсть большие базы.
Их вообще никогда не обновляют. Тем более - автоматически.

База в гиг - уже большая, если стоит на ноутбуке и синхронизируется с сервером как по структуре, так и по данным, особенно если это происходит раз в несколько минут.
У вас репликатор реплицирует метаданные?
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39169056
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fb user,

Обновление метаданных раз в несколько минут? Это особый путь джедая.
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39169064
fb user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DarkMasterОбновление метаданных раз в несколько минут?
Нет. Только при изменении структуры в главной базе. А она там может измениться например накатом обновления, включающим как изменения структуры, так и изменения данных.
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39169070
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fb userБаза в гиг - уже большая, если стоит на ноутбуке и синхронизируется с
сервером как по структуре, так и по данным, особенно если это происходит раз в несколько
минут.
Даже на ноутбуке гигабайтная база - игрушечный размер.

С репликацией метаданных это к Red Database, они такое делают. Я - нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39169074
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fb user,

это, давайте вопрос репликации (метаданных) отдельно. Это уже следующий вопрос, после реализации обновлений метаданных БД.
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39169262
Mironico
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Буду как и планировал скриптами от версии до версии.

Еще что хотел спросить..
Юзаю FIB, есть там pFIBBackupService, не могу понять
как проконтролировать удачно ли прошел бэкап.
В доках не совсем понятно, получается только через лог?
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39169272
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvВроде бы обновлятор 1с работает как раз по второй схеме.Нет, скорее по первой.
Обновления должны устанавливаться по очереди, хотя некоторые "немножко кумулятивные", и включают в себя возможность перепрыгнуть пару-тройку обновлений.
Теоретически, могут быть полные кумулятивные обновления, но на практике такого не бывает.

И кстати, обновлятор не умеет "по очереди применить пропущенные".
Пользователь нажимает "попробовать обновиться", и обновлятор показывает, до какой версии он может обновиться с текущей.
После обновления пользователь опять нажимает "попробовать обновиться", и обновлятор опять выдаёт следующую доступную версию, либо "обновлений не обнаружено".
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39170026
ZeroMQ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MironicoБуду как и планировал скриптами от версии до версии.

Еще что хотел спросить..
Юзаю FIB, есть там pFIBBackupService, не могу понять
как проконтролировать удачно ли прошел бэкап.
В доках не совсем понятно, получается только через лог?

При ошибке компонент выбрасывает исключение.



Код: pascal
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
type
  TProtocol = (TCP, SPX, NamedPipe, Local);
...
  TBRStruct = packed record
    BackupDirName: string;
    BackupFileName: string;
    PageSize: Integer;
    Protocol: TProtocol;
    Port: string;
    ServerDirName: string;
    ServerFileName: string;
    ServerName: string;
    Password: string;
  end;
...
procedure TDBBackupForm.PrepareBackupStruct(var aBackupStruct: TBRStruct);
// Подготовка данных для бэкапа
begin
  aBackupStruct.BackupDirName := Trim(edTrgDirName.Text); // Текст из контролов "Edit"
  aBackupStruct.BackupFileName := Trim(edTrgFileName.Text);
  aBackupStruct.Protocol := TCP; // Такие дела.

  aBackupStruct.Port := FBPortConnection;

  aBackupStruct.ServerDirName := Trim(edSrcDirName.Text);
  aBackupStruct.ServerFileName := Trim(edSrcFileName.Text);

  if Trim(edTrgServerName.Text) <> '' then begin
    aBackupStruct.ServerName := Trim(edTrgServerName.Text);
    aBackupStruct.Port := FBPortConnection;
  end;

  aBackupStruct.Password := Trim(edPassword.Text);

end;
...
procedure TDBBackupForm.ValidateBackupStruct(var aBackupStruct: TBRStruct);
// Проверка исходных данных
begin
  if aBackupStruct.BackupDirName = '' then
    raise Exception.Create('Не указано имя директории резервной копии');
  if aBackupStruct.BackupFileName = '' then
    raise Exception.Create('Не указано имя файла резервной копии');
  if (aBackupStruct.Protocol <> Local) and (aBackupStruct.ServerName = '') then
    raise Exception.Create('Не указано имя сервера');

  if aBackupStruct.ServerDirName = '' then
    raise Exception.Create('Не указано имя директории на сервере');
  if aBackupStruct.ServerFileName = '' then
    raise Exception.Create('Не указано имя файла базы на сервере');

  if AnsiUpperCase(aBackupStruct.BackupDirName + aBackupStruct.BackupFileName)
    =
    AnsiUpperCase(aBackupStruct.ServerDirName + aBackupStruct.ServerFileName)
    then
    raise
      Exception.Create('Файл копии и файл базы должны быть различны.');

  if aBackupStruct.Password = '' then
  begin
    SetFocusIfPossible(edPassword);
    raise Exception.Create('Не указан пароль SYSDBA.');
  end;

end;
...

procedure TDBBackupForm.btnOkClick(Sender: TObject);
//  Выполнение бэкапа с логированием в edVerbose : TMemo
var
  fBegin, fEnd: TDateTime;
  fError: string;
  fTmpStr: string;

begin

  PrepareBackupStruct(fBRStruct);
  ValidateBackupStruct(fBRStruct);

  btnCancel.Enabled := False;
  btnOk.Enabled := False;
  pcMain.Enabled := False;

  fBegin := Now; // Время начала
  Screen.Cursor := crHourGlass;

  try
    edVerbose.Text := 'Начало резервного копирования. Время: ' +
      DateTimeToStr(fBegin);
    edVerbose.Lines.Add('');
    edVerbose.Lines.Add('');

    srvBackup.Params.Clear;
    srvBackup.Protocol := fBRStruct.Protocol;
    if fBRStruct.Protocol <> Local then
      srvBackup.ServerName := fBRStruct.ServerName + '/' + FBPortConnection
    else
      srvBackup.ServerName := '';

    srvBackup.LibraryName := ConnectDataModule.GetFBClientLibName;

    srvBackup.Params.Values['user_name'] := 'SYSDBA';
    srvBackup.Params.Values['password'] := edPassword.Text;

    pcMain.ActivePage := tsProtocol;
    btnOk.Enabled := pcMain.ActivePage = tsParams;

    try
      srvBackup.Attach;
      srvBackup.BackupFile.Clear;

      fTmpStr := IncludeTrailingPathDelimiter(fBRStruct.BackupDirName);
      // Добавляем слэш в конец пути

      srvBackup.BackupFile.Add(fTmpStr + fBRStruct.BackupFileName);

      if srvBackup.Active then
      begin

        fTmpStr := IncludeTrailingPathDelimiter(fBRStruct.ServerDirName)
          + fBRStruct.ServerFileName;

        srvBackup.DatabaseName := fTmpStr;

        srvBackup.Verbose := cbVerbose.Checked;
        if cbGarbageCollection.Checked then
          srvBackup.Options := srvBackup.Options - [NoGarbageCollection]
        else
          srvBackup.Options := srvBackup.Options + [NoGarbageCollection];

        srvBackup.ServiceStart;

        if srvBackup.Verbose then
          while not srvBackup.Eof do
          begin
            edVerbose.Lines.Add(srvBackup.GetNextLine);
            Application.ProcessMessages
          end
        else
          while srvBackup.IsServiceRunning do
            Application.ProcessMessages;

        // Считаем, что в этой точке backup успешно выполнен
        BusinessDataModule.SaveBRStruct('LastBackup', fBRStruct);

      end;
      fEnd := Now;

    except
      on e: Exception do
      begin
        fEnd := Now;
        fError := ('Ошибка:' + e.Message);
        ShowMessage(fError);
      end
    end
  finally
    if srvBackup.Active then
      srvBackup.Detach;

    Screen.Cursor := crDefault;

    edVerbose.Lines.Add(fError);
    edVerbose.Lines.Add('Резервное копирование завершено. Время: ' +
      DateTimeToStr(fEnd));
    edVerbose.Lines.Add('Затрачено времени: ' + TimeToStr(fEnd - fBegin));

    btnOk.Enabled := pcMain.ActivePage = tsParams;
    btnCancel.Enabled := True;
    pcMain.Enabled := True;
  end
end;


...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39170071
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ZeroMQПри ошибке компонент выбрасывает исключение.
госсподи! какое исключение и на какой строке кода?
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39170079
ZeroMQ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvZeroMQПри ошибке компонент выбрасывает исключение.
госсподи! какое исключение и на какой строке кода?
Нискажу. Зачем ты "госсподи!" написал?
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39177796
Го-стхи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня так: версия БД в проге, версия БД в БД. Для простоты сравнения версии нумеруются #..#.## (ровно две цифры в "дробной" части, она же minor version). Если App_DBVer < DB_DBVer - отлуп, надо обновить прогу. App_DBVer > DB_DBVer - запуск обновлятора, который пошагово наращивает версию до текущей. Для простоты (база небольшая и доступ локальный-эксклюзивный) сделал копирование файла БД и применение обновлений к нему, после чего файл подменяется. Надо бы транзакциями, но тогда возникает проблема использования измененных метаданных в рамках той же транзакции.
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39177991
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Го-стхитогда возникает проблема использования измененных метаданных в рамках той же транзакции.

а базу в single-user mode переводишь?

IMHO корректно такая задача расшивается только *отдельным процессом* обновлятеля, который к тому же просьбами и пинками выгонит из БД всех пользователей перед обновлением.

а после обновления, заново соединяясь уже и метаданные перечитаются на клиентах
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39177992
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...ну и добавление где надо действия "re-connect" в скрипты самого обновлятеля, да.
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39178440
Го-стхи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ariochа базу в single-user mode переводишь?
Пока не было такой нужды, просто отсоединял коннект в самой программе, дальше копирование и обновление копии. Разумеется, сие только для локального эксклюзивного применения. Для муьтиюзера придется придумывать более мудрую схему.
а после обновления, заново соединяясь уже и метаданные перечитаются на клиентах
Не в том дело, просто иногда без реконнекта не идут некоторые апдейты. А если сделать реконнект - уже будет больше одной транзакции, что делает затруднительным консистентный откат к предыдущей версии в случае непредвиденностей. Разве что разносить несовместимые изменения по двум разным апдейтам...
...
Рейтинг: 0 / 0
Внесение изменений в БД при апдейте приложения.
    #39178582
Печень белого медведя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Го-стхи...что делает затруднительным консистентный откат к предыдущей версии...

Бэкап спасает.
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Внесение изменений в БД при апдейте приложения.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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