Модификация структуры базы данных

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
(Изменение версии структуры БД)
 
(не показаны 13 промежуточных версий 2 участников)
Строка 1: Строка 1:
Структура базы данных поставляемой с "голой" платформой называется эталонной, а сама база данных без пользовательских настроек – [[Эталон|эталоном]]. Эталонная структура может меняться с выходом новых версий файла gedemin.exe. Для обновления существующих баз предусмотрен механизм модификации структуры. Рассмотрим его работу на следующем примере: пусть в эталонную структуру базы данных необходимо добавить таблицу '''GD_TEST''' и связанные с ней объекты: первичный ключ и триггер для его автоматического формирования.
+
Начальная база данных для платформы Гедымин создается из SQL скриптов в каталоге [http://code.google.com/p/gedemin/source/browse/trunk#trunk%2FGedemin%2FSQL Gedemin\SQL] с помощью пакетного файла [http://code.google.com/p/gedemin/source/browse/trunk/Gedemin/SQL/cr.bat cr.bat]. Формат вызова:
  
=== Создание SQL скрипта ===
+
  cr.bat {server[/port]|embed} database [fb\bin path] 
  
Первым делом создадим в подкаталоге SQL каталога GEDEMIN файл с именем gd_test.sql, который содержит следующий скрипт:
+
Например, команда:
  
   SET NAMES WIN1251;
+
   cr.bat localhost c:\temp\test.fdb
+
 
  SET SQL DIALECT 3;
+
Создаст чистую базу данных с именем test.fdb в папке c:\temp. Особенность использования данного пакетного файла в том, что при вызове с указанием имени сетевого сервера, диск, где будет располагаться файл базы данных, должен быть подключен на локальном компьютере под той же буквой, какую он имеет на сервере.
+
 
  CONNECT '<Имя сервера и путь к файлу с эталонной БД>'
+
Файл cr.bat формирует базу данных в два прохода. Сначала из отдельных скриптов собирается файл temp.sql и передается на вход команды isql. Получившаяся промежуточная база данных обрабатывается утилитой '''makelbrbtree.exe''', которая создает скрипты метаданных для всех таблиц интервальных деревьев. Из исходных и полученных скриптов формируется единый файл '''etalon.sql''' из которого создает эталонная база данных.
    USER 'SYSDBA' PASSWORD 'masterkey';
+
 
+
История изменений структуры базы данных фиксируется в таблице [[FIN_VERSIONINFO|fin_versioninfo]]. Ее структура и наполнение задаются в файле [http://code.google.com/p/gedemin/source/browse/trunk/Gedemin/SQL/gd_version.sql gd_version.sql]. Запись с максимальным идентификатором соответствует текущей версии структуры. Ее можно определить запросом:
  COMMIT;
+
 
+
<syntaxhighlight lang="SQL">  
 +
  SELECT FIRST 1 * FROM fin_versioninfo ORDER BY id DESC
 +
</syntaxhighlight>
 +
 
 +
или заглянуть в окно '''О системе''' на вкладку '''Параметры системы'''.
 +
 
 +
Структура базы данных поставляемой с "голой" платформой называется эталонной, а сама база данных без пользовательских настроек – [[Эталон|эталоном]]. Эталонная структура может меняться с выходом новых версий файла gedemin.exe. Для обновления существующих баз предусмотрен механизм модификации структуры. Рассмотрим его работу на следующем примере: пусть в эталонную структуру базы данных необходимо добавить некоторую таблицу '''GD_TEST''' и связанные с ней два объекта: первичный ключ и триггер для автоматического формирования идентификатора записи.
 +
 
 +
Последовательность действий по внесению изменений в структуру эталонной базы данных включает следующие шаги:
 +
 
 +
# Создать файл с SQL скриптом или внести изменения в один из существующих файлов.
 +
# Добавить в таблицу [[FIN_VERSIONINFO|fin_versioninfo]] запись.
 +
# Добавить имя созданного файла в список в cr.bat.
 +
# Написать процедуру модификации структуры базы данных.
 +
# Добавить процедуру модификации в список.
 +
# Перекомпилировать и запустить gedemin.exe.
 +
 
 +
=== 1. Создание SQL скрипта ===
 +
 
 +
Первым делом создадим в подкаталоге '''SQL''' папки '''GEDEMIN''' файл с именем '''gd_test.sql''' и поместим в него следующий скрипт:
 +
 
 +
<syntaxhighlight lang="SQL">
 
   CREATE TABLE gd_test (
 
   CREATE TABLE gd_test (
 
     id      dintkey,
 
     id      dintkey,
Строка 37: Строка 58:
 
   
 
   
 
   COMMIT;
 
   COMMIT;
 +
</syntaxhighlight>
  
=== Изменение версии структуры БД ===
+
=== 2. Изменение версии структуры БД ===
  
История изменения версии структуры БД хранится в таблице [[FIN_VERSIONINFO|fin_versioninfo]]. Ее структура и наполнение задаются в файле gd_version.sql. Запись с максимальным идентификатором соответствует текущей версии структуры. Отыщем максимальный номер и добавим в указанный файл новую запись о версии:
+
Отыщем в файле [[FIN_VERSIONINFO|fin_versioninfo]] последний номер версии структуры базы данных и после него добавим команду:
  
 
   INSERT INTO fin_versioninfo
 
   INSERT INTO fin_versioninfo
 
     VALUES (100, '0000.0001.0000.0127', '16.01.2008', 'GD_TEST table added');
 
     VALUES (100, '0000.0001.0000.0127', '16.01.2008', 'GD_TEST table added');
  
Обратите внимание, что в вашем случае идентификатор, строковое представление версии БД, дата внесения изменений будут другими!
+
'''Обратите внимание, что в вашем случае идентификатор, строковое представление версии БД и дата внесения изменений будут другими! Указанная выше команда -- это только пример!'''
  
=== Добавление вызова скрипта в пакетный файл формирования эталонной БД ===
+
=== 3. Добавление вызова скрипта в пакетный файл ===
  
Эталонная БД формируется с помощью пакетного файла create.bat из каталога SQL. Откроем его на редактирование и добавим строку вызова нашего скрипта:
+
Откроем файл cr.bat на редактирование. Найдем в нем список команд формирования общего текста из отдельных файлов со скриптами:
  
  ...
+
<syntaxhighlight lang="dos">
  isql -i gd_file.sql
+
...
 +
copy result.sql /a + gd_file.sql               /a result.sql    > nul
 +
copy result.sql /a + gd_block_rule.sql        /a result.sql    > nul
 +
copy result.sql /a + rpl_database.sql          /a result.sql    > nul
 +
 
 +
echo SET NAMES WIN1251;                        >  temp_hdr.sql
 +
echo SET SQL DIALECT 3;                        >> temp_hdr.sql
 +
echo CREATE DATABASE '%database_name%'        >> temp_hdr.sql
 +
echo USER %user_name% PASSWORD %user_pass%    >> temp_hdr.sql
 +
echo PAGE_SIZE 8192                            >> temp_hdr.sql
 +
echo DEFAULT CHARACTER SET WIN1251;            >> temp_hdr.sql
 +
...
 +
</syntaxhighlight>
 +
 
 +
добавим обращение к нашему файлу:
 +
 
 +
<syntaxhighlight lang="dos">
 +
...
 +
copy result.sql /a + gd_file.sql              /a result.sql    > nul
 +
copy result.sql /a + gd_block_rule.sql        /a result.sql    > nul
 +
copy result.sql /a + rpl_database.sql          /a result.sql    > nul
 +
copy result.sql /a + gd_test.sql              /a result.sql    > nul
 +
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 +
 
 +
echo SET NAMES WIN1251;                        >  temp_hdr.sql
 +
echo SET SQL DIALECT 3;                        >> temp_hdr.sql
 +
echo CREATE DATABASE '%database_name%'        >> temp_hdr.sql
 +
echo USER %user_name% PASSWORD %user_pass%    >> temp_hdr.sql
 +
echo PAGE_SIZE 8192                            >> temp_hdr.sql
 +
echo DEFAULT CHARACTER SET WIN1251;            >> temp_hdr.sql
 +
...
 +
</syntaxhighlight>
 +
 
 +
=== 4. Создание процедуры модификации структуры БД ===
 +
 
 +
После того, как мы создали файл со скриптом и добавили его в список cr.bat, эталонная база будет формироваться с нашей таблицей. Но, как быть с теми базами, которые были созданы ранее? Для внесения изменений в существующую структуру следует создать процедуру модификации типа [[GdModify.TProcAddr]]. Обычно, каждая процедура находится в своем файле в подкаталоге [http://code.google.com/p/gedemin/source/browse/trunk#trunk%2FGedemin%2FSetup Setup]. Название юнита принято начинать с префикса mdf_.
 +
 
 +
На входе процедура получает коннект к базе данных и процедуру обратного вызова для логирования. В общем случае, алгоритм обновления выглядит следующим образом:
 +
 
 +
# Создаются и связываются объекты транзакции и SQL команды
 +
# Стартует транзакция
 +
# Делаются необходимые проверки
 +
# Выполняется одна или несколько SQL команд
 +
# Помещаются сообщения в лог о ходе процесса
 +
# Добавляется запись в fin_versioninfo о новом номере версии структуры БД
 +
# Комитится транзакция
 +
# Если произошла ошибка, то сообщение помещается в лог и транзакция откатывается
 +
 
 +
Ниже приведен пример файла для добавления в базу данных таблицы GD_TEST:
 +
<syntaxhighlight lang="pascal">
 +
  unit mdf_AddTestTable;
 
   
 
   
   rem Вызываем наш скрипт
+
   interface
  isql -i gd_test.sql
+
 
   
 
   
   makelbrbtree.exe /sn czech:k:\bases\gedemin\etalon.fdb /tmp tst_tree_tbl.sql
+
   uses
   ...
+
    IBDatabase, gdModify;
 +
 +
  procedure AddTestTable(IBDB: TIBDatabase; Log: TModifyLog);
 +
 +
  implementation
 +
 
 +
  uses
 +
    IBSQL, SysUtils;
 +
 +
  procedure AddTestTable(IBDB: TIBDatabase; Log: TModifyLog);
 +
  var
 +
    FTransaction: TIBTransaction;
 +
    FIBSQL: TIBSQL;
 +
  begin
 +
    Log('Начато добавление таблицы GD_TEST');
 +
    FTransaction := TIBTransaction.Create(nil);
 +
    try
 +
      FTransaction.DefaultDatabase := IBDB;
 +
      FTransaction.StartTransaction;
 +
      try
 +
        FIBSQL := TIBSQL.Create(nil);
 +
        try
 +
          FIBSQL.Transaction := FTransaction;
 +
 +
          FIBSQL.SQL.Text :=
 +
            'CREATE TABLE gd_test ( ' + #13#10 +
 +
            '  id      dintkey,    ' + #13#10 +
 +
            '  name    dname        ' + #13#10 +
 +
            ')';
 +
          FIBSQL.ExecQuery;
 +
 
 +
          FIBSQL.SQL.Text :=
 +
            'ALTER TABLE gd_test ADD CONSTRAINT gd_pk_test_id ' + #13#10 +
 +
            '  PRIMARY KEY (id)';
 +
          FIBSQL.ExecQuery;
 +
 +
          FIBSQL.SQL.Text :=
 +
            'CREATE TRIGGER gd_bi_test ' + #13#10 +
 +
            '  BEFORE INSERT '          + #13#10 +
 +
            '  POSITION 0 '              + #13#10 +
 +
            'AS '                        + #13#10 +
 +
            'BEGIN '                    + #13#10 +
 +
            '  IF (NEW.id IS NULL) THEN' + #13#10 +
 +
            '    NEW.id = GEN_ID(gd_g_unique, 1) + GEN_ID(gd_g_offset, 0); ' + #13#10 +
 +
            'END';
 +
          FIBSQL.ExecQuery;
 +
 +
          FIBSQL.Close;
 +
          FIBSQL.SQL.Text :=
 +
            'UPDATE OR INSERT INTO fin_versioninfo ' +
 +
            '  VALUES (100, ''0000.0001.0000.0127'', ''16.01.2008'', ''GD_TEST table added'') ' +
 +
            '  MATCHING (id)';
 +
          FIBSQL.ExecQuery;
 +
          FIBSQL.Close;
 +
 +
          FTransaction.Commit;
 +
          Log('Добавление таблицы GD_TEST успешно завершено');
 +
       
 +
        finally
 +
          FIBSQL.Free;
 +
        end;
 +
      except
 +
        on E: Exception do
 +
        begin
 +
          FTransaction.Rollback;
 +
          Log(E.Message);
 +
        end;
 +
      end;
 +
    finally
 +
      FTransaction.Free;
 +
    end;
 +
  end; 
 +
 +
  end.
 +
</syntaxhighlight>
 +
 
 +
=== 5. Добавление процедуры в общий список ===
 +
 
 +
Все подобные процедуры вместе с номером версии структуры БД заносятся в глобальный массив [[mdf_proclist.cProcList|cProcList]]. При запуске Гедымина, после аутентификации пользователя и подключения к базе, номер текущей версии структуры БД сверяется с номером из последнего элемента массива. Если номер текущей версии меньше или равен номеру из последнего элемента, то создается объект типа [[gdModify.TgdModify|TgdModify]] и запускается процесс апгрейда.
 +
 
 +
В ходе обновления последовательно выполняются процедуры из массива [[mdf_proclist.cProcList|cProcList]], пока выполняется условие:
 +
 
 +
   FDBVersion <= cProcList[I].ModifyVersion
 +
 
 +
где FDBVersion -- номер текущей версии структуры БД, cProcList[I].ModifyVersion -- номер версии, указанный для I-той процедуры.
  
Обычно, вызов новых скриптов добавляется в конец файла, перед вызовом утилиты переформирования интервальных деревьев.
+
Добавление нашей процедуры в список требует трех простых действий:
  
=== Создание процедуры модификации структуры существующей БД ===
+
# Добавить имя нашего модуля в секцию uses юнита [[mdf_proclist]].
 +
# Увеличить счетчик [[mdf_proclist.cProcCount]].
 +
# Добавить запись в массив [[mdf_proclist.cProcList]]. Еще раз обратите внимание на то, что ModifyVersion для нашей процедуры это не тот номер, который она присвоит в результате своего выполнения, а предыдущий!
  
=== Добавление процедуры в общий список ===
+
=== 6. Компиляция и запуск ===
  
=== Компиляция и запуск ===
+
Теперь можно перекомпилировать и запустить gedemin.exe. При попытке подключения к базе данных с устаревшей структурой под учетной записью [[Administrator]], на экран будет выдано сообщение о необходимости обновить структуру. Не забывайте делать архивные копии базы, перед внесением в нее изменений!
  
 
[[Category:База данных]]
 
[[Category:База данных]]
 +
[[Category:Школа системного администратора]]
 +
__NOTOC__

Текущая версия на 21:31, 15 января 2012

Начальная база данных для платформы Гедымин создается из SQL скриптов в каталоге Gedemin\SQL с помощью пакетного файла cr.bat. Формат вызова:

 cr.bat {server[/port]|embed} database [fb\bin path]  

Например, команда:

 cr.bat localhost c:\temp\test.fdb

Создаст чистую базу данных с именем test.fdb в папке c:\temp. Особенность использования данного пакетного файла в том, что при вызове с указанием имени сетевого сервера, диск, где будет располагаться файл базы данных, должен быть подключен на локальном компьютере под той же буквой, какую он имеет на сервере.

Файл cr.bat формирует базу данных в два прохода. Сначала из отдельных скриптов собирается файл temp.sql и передается на вход команды isql. Получившаяся промежуточная база данных обрабатывается утилитой makelbrbtree.exe, которая создает скрипты метаданных для всех таблиц интервальных деревьев. Из исходных и полученных скриптов формируется единый файл etalon.sql из которого создает эталонная база данных.

История изменений структуры базы данных фиксируется в таблице fin_versioninfo. Ее структура и наполнение задаются в файле gd_version.sql. Запись с максимальным идентификатором соответствует текущей версии структуры. Ее можно определить запросом:

 
  SELECT FIRST 1 * FROM fin_versioninfo ORDER BY id DESC

или заглянуть в окно О системе на вкладку Параметры системы.

Структура базы данных поставляемой с "голой" платформой называется эталонной, а сама база данных без пользовательских настроек – эталоном. Эталонная структура может меняться с выходом новых версий файла gedemin.exe. Для обновления существующих баз предусмотрен механизм модификации структуры. Рассмотрим его работу на следующем примере: пусть в эталонную структуру базы данных необходимо добавить некоторую таблицу GD_TEST и связанные с ней два объекта: первичный ключ и триггер для автоматического формирования идентификатора записи.

Последовательность действий по внесению изменений в структуру эталонной базы данных включает следующие шаги:

  1. Создать файл с SQL скриптом или внести изменения в один из существующих файлов.
  2. Добавить в таблицу fin_versioninfo запись.
  3. Добавить имя созданного файла в список в cr.bat.
  4. Написать процедуру модификации структуры базы данных.
  5. Добавить процедуру модификации в список.
  6. Перекомпилировать и запустить gedemin.exe.

[править] 1. Создание SQL скрипта

Первым делом создадим в подкаталоге SQL папки GEDEMIN файл с именем gd_test.sql и поместим в него следующий скрипт:

 
  CREATE TABLE gd_test (
    id      dintkey,
    name    dname
  );
 
  ALTER TABLE gd_test ADD CONSTRAINT gd_pk_test_id
    PRIMARY KEY (id);
 
  SET TERM ^ ;
 
  CREATE TRIGGER gd_bi_test
    BEFORE INSERT
    POSITION 0
  AS
  BEGIN
    IF (NEW.id IS NULL) THEN
      NEW.id = GEN_ID(gd_g_unique, 1) + GEN_ID(gd_g_offset, 0);
  END
  ^
 
  SET TERM ; ^
 
  COMMIT;

[править] 2. Изменение версии структуры БД

Отыщем в файле fin_versioninfo последний номер версии структуры базы данных и после него добавим команду:

 INSERT INTO fin_versioninfo
   VALUES (100, '0000.0001.0000.0127', '16.01.2008', 'GD_TEST table added');

Обратите внимание, что в вашем случае идентификатор, строковое представление версии БД и дата внесения изменений будут другими! Указанная выше команда -- это только пример!

[править] 3. Добавление вызова скрипта в пакетный файл

Откроем файл cr.bat на редактирование. Найдем в нем список команд формирования общего текста из отдельных файлов со скриптами:

...
copy result.sql /a + gd_file.sql               /a result.sql    > nul
copy result.sql /a + gd_block_rule.sql         /a result.sql    > nul
copy result.sql /a + rpl_database.sql          /a result.sql    > nul
 
echo SET NAMES WIN1251;                        >  temp_hdr.sql
echo SET SQL DIALECT 3;                        >> temp_hdr.sql
echo CREATE DATABASE '%database_name%'         >> temp_hdr.sql
echo USER %user_name% PASSWORD %user_pass%     >> temp_hdr.sql 
echo PAGE_SIZE 8192                            >> temp_hdr.sql
echo DEFAULT CHARACTER SET WIN1251;            >> temp_hdr.sql
...

добавим обращение к нашему файлу:

...
copy result.sql /a + gd_file.sql               /a result.sql    > nul
copy result.sql /a + gd_block_rule.sql         /a result.sql    > nul
copy result.sql /a + rpl_database.sql          /a result.sql    > nul
copy result.sql /a + gd_test.sql               /a result.sql    > nul
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
echo SET NAMES WIN1251;                        >  temp_hdr.sql
echo SET SQL DIALECT 3;                        >> temp_hdr.sql
echo CREATE DATABASE '%database_name%'         >> temp_hdr.sql
echo USER %user_name% PASSWORD %user_pass%     >> temp_hdr.sql 
echo PAGE_SIZE 8192                            >> temp_hdr.sql
echo DEFAULT CHARACTER SET WIN1251;            >> temp_hdr.sql
...

[править] 4. Создание процедуры модификации структуры БД

После того, как мы создали файл со скриптом и добавили его в список cr.bat, эталонная база будет формироваться с нашей таблицей. Но, как быть с теми базами, которые были созданы ранее? Для внесения изменений в существующую структуру следует создать процедуру модификации типа GdModify.TProcAddr. Обычно, каждая процедура находится в своем файле в подкаталоге Setup. Название юнита принято начинать с префикса mdf_.

На входе процедура получает коннект к базе данных и процедуру обратного вызова для логирования. В общем случае, алгоритм обновления выглядит следующим образом:

  1. Создаются и связываются объекты транзакции и SQL команды
  2. Стартует транзакция
  3. Делаются необходимые проверки
  4. Выполняется одна или несколько SQL команд
  5. Помещаются сообщения в лог о ходе процесса
  6. Добавляется запись в fin_versioninfo о новом номере версии структуры БД
  7. Комитится транзакция
  8. Если произошла ошибка, то сообщение помещается в лог и транзакция откатывается

Ниже приведен пример файла для добавления в базу данных таблицы GD_TEST:

  unit mdf_AddTestTable;
 
  interface
 
  uses
    IBDatabase, gdModify;
 
  procedure AddTestTable(IBDB: TIBDatabase; Log: TModifyLog);
 
  implementation
 
  uses
    IBSQL, SysUtils;
 
  procedure AddTestTable(IBDB: TIBDatabase; Log: TModifyLog);
  var
    FTransaction: TIBTransaction;
    FIBSQL: TIBSQL;
  begin
    Log('Начато добавление таблицы GD_TEST');
    FTransaction := TIBTransaction.Create(nil);
    try
      FTransaction.DefaultDatabase := IBDB;
      FTransaction.StartTransaction;
      try
        FIBSQL := TIBSQL.Create(nil);
        try
          FIBSQL.Transaction := FTransaction;
 
          FIBSQL.SQL.Text := 
            'CREATE TABLE gd_test ( ' + #13#10 +
            '  id      dintkey,     ' + #13#10 +
            '  name    dname        ' + #13#10 +
            ')';
          FIBSQL.ExecQuery;
 
          FIBSQL.SQL.Text := 
            'ALTER TABLE gd_test ADD CONSTRAINT gd_pk_test_id ' + #13#10 +
            '  PRIMARY KEY (id)';
          FIBSQL.ExecQuery;
 
          FIBSQL.SQL.Text := 
            'CREATE TRIGGER gd_bi_test ' + #13#10 +
            '  BEFORE INSERT '           + #13#10 +
            '  POSITION 0 '              + #13#10 +
            'AS '                        + #13#10 +
            'BEGIN '                     + #13#10 +
            '  IF (NEW.id IS NULL) THEN' + #13#10 +
            '    NEW.id = GEN_ID(gd_g_unique, 1) + GEN_ID(gd_g_offset, 0); ' + #13#10 +
            'END';
          FIBSQL.ExecQuery;
 
          FIBSQL.Close;
          FIBSQL.SQL.Text :=
            'UPDATE OR INSERT INTO fin_versioninfo ' +
            '  VALUES (100, ''0000.0001.0000.0127'', ''16.01.2008'', ''GD_TEST table added'') ' +
            '  MATCHING (id)';
          FIBSQL.ExecQuery;
          FIBSQL.Close;
 
          FTransaction.Commit;
          Log('Добавление таблицы GD_TEST успешно завершено');
 
        finally
          FIBSQL.Free;
        end;
      except
        on E: Exception do
        begin
          FTransaction.Rollback;
          Log(E.Message);
        end;
      end;
    finally
      FTransaction.Free;
    end;
  end;  
 
  end.

[править] 5. Добавление процедуры в общий список

Все подобные процедуры вместе с номером версии структуры БД заносятся в глобальный массив cProcList. При запуске Гедымина, после аутентификации пользователя и подключения к базе, номер текущей версии структуры БД сверяется с номером из последнего элемента массива. Если номер текущей версии меньше или равен номеру из последнего элемента, то создается объект типа TgdModify и запускается процесс апгрейда.

В ходе обновления последовательно выполняются процедуры из массива cProcList, пока выполняется условие:

 FDBVersion <= cProcList[I].ModifyVersion

где FDBVersion -- номер текущей версии структуры БД, cProcList[I].ModifyVersion -- номер версии, указанный для I-той процедуры.

Добавление нашей процедуры в список требует трех простых действий:

  1. Добавить имя нашего модуля в секцию uses юнита mdf_proclist.
  2. Увеличить счетчик mdf_proclist.cProcCount.
  3. Добавить запись в массив mdf_proclist.cProcList. Еще раз обратите внимание на то, что ModifyVersion для нашей процедуры это не тот номер, который она присвоит в результате своего выполнения, а предыдущий!

[править] 6. Компиляция и запуск

Теперь можно перекомпилировать и запустить gedemin.exe. При попытке подключения к базе данных с устаревшей структурой под учетной записью Administrator, на экран будет выдано сообщение о необходимости обновить структуру. Не забывайте делать архивные копии базы, перед внесением в нее изменений!

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты