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

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
м (Правки GettaSitri (обсуждение) откачены к версии SYSDBA)
Строка 1: Строка 1:
Структура базы данных поставляемой с "голой" платформой называется эталонной, а сама база данных без пользовательских настроек – [[Эталон|эталоном]]. Эталонная структура может меняться с выходом новых версий файла gedemin.exe. Для обновления существующих баз предусмотрен механизм модификации структуры. Рассмотрим его работу на следующем примере: пусть в эталонную структуру базы данных необходимо добавить таблицу '''GD_TEST''' и связанные с ней объекты: первичный ключ и триггер для его автоматического формирования.
+
Структура базы данных поставляемой с "голой" платформой называется эталонной, а сама база данных без пользовательских настроек – [[Эталон|эталоном]]. Эталонная структура может меняться с выходом новых версий файла gedemin.exe. Для обновления существующих баз предусмотрен механизм модификации структуры. Рассмотрим его работу на следующем примере: пусть в эталонную структуру базы данных необходимо добавить таблицу '''GD_TEST''' и связанные с ней объекты: первичный ключ и триггер для его автоматического формирования.
  
=== Создание SQL скрипта ===
+
=== Создание SQL скрипта ===
  
Первым делом создадим в подкаталоге SQL каталога GEDEMIN файл с именем gd_test.sql, который содержит следующий скрипт:
+
Первым делом создадим в подкаталоге SQL каталога GEDEMIN файл с именем gd_test.sql, который содержит следующий скрипт:
  
 
   SET NAMES WIN1251;
 
   SET NAMES WIN1251;
Строка 9: Строка 9:
 
   SET SQL DIALECT 3;
 
   SET SQL DIALECT 3;
 
   
 
   
   CONNECT '<Имя сервера и путь к файлу с эталонной БД>'
+
   CONNECT '<Имя сервера и путь к файлу с эталонной БД>'
 
     USER 'SYSDBA' PASSWORD 'masterkey';
 
     USER 'SYSDBA' PASSWORD 'masterkey';
 
   
 
   
Строка 38: Строка 38:
 
   COMMIT;
 
   COMMIT;
  
=== Изменение версии структуры БД ===
+
=== Изменение версии структуры БД ===
  
История изменения версии структуры БД хранится в таблице [[FIN_VERSIONINFO|fin_versioninfo]]. Ее структура и наполнение задаются в файле gd_version.sql. Запись с максимальным идентификатором соответствует текущей версии структуры. Отыщем максимальный номер и добавим в указанный файл новую запись о версии:
+
История изменения версии структуры БД хранится в таблице [[FIN_VERSIONINFO|fin_versioninfo]]. Ее структура и наполнение задаются в файле gd_version.sql. Запись с максимальным идентификатором соответствует текущей версии структуры. Отыщем максимальный номер и добавим в указанный файл новую запись о версии:
  
 
   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');
  
'''Обратите внимание, что в вашем случае идентификатор, строковое представление версии БД, дата внесения изменений будут другими!'''
+
'''Обратите внимание, что в вашем случае идентификатор, строковое представление версии БД, дата внесения изменений будут другими!'''
  
=== Добавление вызова скрипта в пакетный файл формирования эталонной БД ===
+
=== Добавление вызова скрипта в пакетный файл формирования эталонной БД ===
  
Эталонная БД формируется с помощью пакетного файла create.bat из каталога SQL. Откроем его на редактирование и добавим строку вызова нашего скрипта:
+
Эталонная БД формируется с помощью пакетного файла create.bat из каталога SQL. Откроем его на редактирование и добавим строку вызова нашего скрипта:
  
 
   ...
 
   ...
 
   isql -i gd_file.sql
 
   isql -i gd_file.sql
 
   
 
   
   rem Вызываем наш скрипт
+
   rem Вызываем наш скрипт
 
   isql -i gd_test.sql
 
   isql -i gd_test.sql
 
   
 
   
Строка 60: Строка 60:
 
   ...
 
   ...
  
Как показано в примере выше, обычно, вызов новых скриптов добавляется в конец файла, перед вызовом утилиты переформирования интервальных деревьев.
+
Как показано в примере выше, обычно, вызов новых скриптов добавляется в конец файла, перед вызовом утилиты переформирования интервальных деревьев.
  
=== Создание процедуры модификации структуры существующей БД ===
+
=== Создание процедуры модификации структуры существующей БД ===
  
Теперь, после того, как мы создали файл со скриптом и добавили его в список create.bat, эталонная база будет формироваться уже с нашей таблицей. Но, как быть с теми базами. которые были созданы ранее и уже эксплуатируются у пользователей? Для внесения изменений в структуру существующей базы следует создать процедуру модификации. Обычно, каждая процедура находится в своем отдельном файле в подкаталоге Setup основного каталога проекта. Название юнита принято начинать с префикса mdf_.
+
Теперь, после того, как мы создали файл со скриптом и добавили его в список create.bat, эталонная база будет формироваться уже с нашей таблицей. Но, как быть с теми базами. которые были созданы ранее и уже эксплуатируются у пользователей? Для внесения изменений в структуру существующей базы следует создать процедуру модификации. Обычно, каждая процедура находится в своем отдельном файле в подкаталоге Setup основного каталога проекта. Название юнита принято начинать с префикса mdf_.
  
 
   unit mdf_AddTestTable;
 
   unit mdf_AddTestTable;
Строка 85: Строка 85:
 
     FIBSQL: TIBSQL;
 
     FIBSQL: TIBSQL;
 
   begin
 
   begin
     Log('Начато добавление таблицы GD_TEST');
+
     Log('Начато добавление таблицы GD_TEST');
 
     FTransaction := TIBTransaction.Create(nil);
 
     FTransaction := TIBTransaction.Create(nil);
 
     try
 
     try
Строка 128: Строка 128:
 
   
 
   
 
           FTransaction.Commit;
 
           FTransaction.Commit;
           Log('Добавление таблицы GD_TEST успешно завершено');
+
           Log('Добавление таблицы GD_TEST успешно завершено');
 
          
 
          
 
         finally
 
         finally
Строка 147: Строка 147:
 
   end.
 
   end.
  
=== Добавление процедуры в общий список ===
+
=== Добавление процедуры в общий список ===
  
Вызов процедур модификации осуществляется последовательно по списку, который находится в файле [[MDF_PROCLIST.PAS|mdf_proclist.pas]]. Для каждой позиции в списке, кроме самой процедуры, указывается номер версии структуры БД -- ModifyVersion. Процедура будет вызвана, если текущий номер версии структуры БД '''меньше либо равен''' значению ModifyVersion.
+
Вызов процедур модификации осуществляется последовательно по списку, который находится в файле [[MDF_PROCLIST.PAS|mdf_proclist.pas]]. Для каждой позиции в списке, кроме самой процедуры, указывается номер версии структуры БД -- ModifyVersion. Процедура будет вызвана, если текущий номер версии структуры БД '''меньше либо равен''' значению ModifyVersion.
  
Добавление нашей процедуры в список требует трех простых действий:
+
Добавление нашей процедуры в список требует трех простых действий:
  
# Добавить имя нашего модуля в секцию uses.
+
# Добавить имя нашего модуля в секцию uses.
# Увеличить счетчик cProcCount.
+
# Увеличить счетчик cProcCount.
# Добавить запись в массив cProcList. Еще раз обратите внимание на то, что ModifyVersion для нашей процедуры это не тот номер, который она присвоит в результате своего выполнения, а предыдущий!
+
# Добавить запись в массив cProcList. Еще раз обратите внимание на то, что ModifyVersion для нашей процедуры это не тот номер, который она присвоит в результате своего выполнения, а предыдущий!
  
=== Компиляция и запуск ===
+
=== Компиляция и запуск ===
  
Теперь можно перекомпилировать и запустить gedemin.exe. При попытке подключения к базе данных с устаревшей структурой под учетной записью Administrator, на экран будет выдано сообщение о необходимости обновить структуру.  
+
Теперь можно перекомпилировать и запустить gedemin.exe. При попытке подключения к базе данных с устаревшей структурой под учетной записью Administrator, на экран будет выдано сообщение о необходимости обновить структуру.  
  
[[Category:База данных]]
+
[[Category:База данных]]

Версия 16:19, 10 июля 2009

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

Содержание

Создание SQL скрипта

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

 SET NAMES WIN1251;

 SET SQL DIALECT 3;

 CONNECT '<Имя сервера и путь к файлу с эталонной БД>'
   USER 'SYSDBA' PASSWORD 'masterkey';

 COMMIT;

 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;

Изменение версии структуры БД

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

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

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

Добавление вызова скрипта в пакетный файл формирования эталонной БД

Эталонная БД формируется с помощью пакетного файла create.bat из каталога SQL. Откроем его на редактирование и добавим строку вызова нашего скрипта:

 ...
 isql -i gd_file.sql

 rem Вызываем наш скрипт 
 isql -i gd_test.sql

 makelbrbtree.exe /sn czech:k:\bases\gedemin\etalon.fdb /tmp tst_tree_tbl.sql
 ...

Как показано в примере выше, обычно, вызов новых скриптов добавляется в конец файла, перед вызовом утилиты переформирования интервальных деревьев.

Создание процедуры модификации структуры существующей БД

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

 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 :=
           'INSERT INTO fin_versioninfo ' +
           '  VALUES (100, '0000.0001.0000.0127', '16.01.2008', 'GD_TEST table added')';
         try
           FIBSQL.ExecQuery;
         except
         end;

         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.

Добавление процедуры в общий список

Вызов процедур модификации осуществляется последовательно по списку, который находится в файле mdf_proclist.pas. Для каждой позиции в списке, кроме самой процедуры, указывается номер версии структуры БД -- ModifyVersion. Процедура будет вызвана, если текущий номер версии структуры БД меньше либо равен значению ModifyVersion.

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

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

Компиляция и запуск

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

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

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