Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];

Вниз

Об особенностях FireBird   Найти похожие ветки 

 
Ega23 ©   (2008-01-21 11:25) [0]

Всё-таки, наверное, это тема для "Прочее", нежели для "Базы", т.к. тут филосовские аспекты затрагиваются.
В общем, вопрос такой: каким образом Вы поддерживаете структуру БД в случае большого количества инсталляций.
Сейчас поясню на примере MSSQL: создаётся какая-нибудь информационная система. Под неё создаётся модель БД (таблицы, связи, ХП, триггеры etc). Разработка модели ведётся какими-то средствами (в моём случае отдаю предпочтение PowerDesigner + Query Analyzer). В какой-то момент принимается решение, что данная система "устаканилась", возможно появляются первые инсталляции системы у клиентов.
В этом случае дальнейшие изменения в структурах БД ведутся не через Reverse Engeneer, а патч-скриптом. Например:

if not exists (select 1
              from  sysobjects
              where  id = object_id("TVHistory")
               and   type = "U")
begin
 create table TVHistory (
  UNID                 int Identity(1,1)    not null,
  EventGUID            uniqueidentifier     not null,
  DatIn                datetime             not null,
  DatOut               datetime             not null,
  RegDatIn             datetime             not null,
  CamObjID             int                  not null,
  CamObjNam            varchar(255)         not null,
  FileNam              varchar(255)         not null,
  FileNot              varchar(255)         not null,
  StatFl               tinyint              not null,
  constraint PK_TVHISTORY primary key  (UNID)
 );
 Print("Table created: TVHistory");
end;
go


Таким образом, для обновления структуры БД ведётся один (или несколько) патч-скриптов, в которых аккуратным образом прописывается создание таблиц, связок, изменение структуры, вставка каких-либо записей в справочники и т.п.

Далее, всё это дело прогоняется через isql + некий свой графический интерфейс на реальной базе. Т.е. процесс обновления БД у клиента происходит так: приехал на объект, сделал бэкап, запустил прогон патч-скриптов, запустил прогон процедур-триггеров, проверил работоспособность.

По такой идеологии работаем уже достаточно давно с MSSQL.
Вопрос: практикуется ли подобная схема обновления стуктуры БД в случае FireBird? Какие могут быть "подводные камни"?


 
Игорь Шевченко ©   (2008-01-21 11:34) [1]

Мы делаем проще - вводим понятие версии схемы. Соответственно, каждый патч поднимает версию и работает только в случае соответствия версии схемы той, для которой предназначен патч. Сам патч тоже изменяет (поднимает) версию.


 
Ega23 ©   (2008-01-21 11:39) [2]


> Мы делаем проще - вводим понятие версии схемы. Соответственно,
>  каждый патч поднимает версию и работает только в случае
> соответствия версии схемы той, для которой предназначен
> патч. Сам патч тоже изменяет (поднимает) версию.


Да можно и так. Даже, пожалуй, более логичный способ (хотя нюансы также есть).
Но меня больше интересует сам механизм поднятия структуры БД до определённой "версии схемы".


 
Reindeer Moss Eater ©   (2008-01-21 11:47) [3]

Особенность вроде всего одна - ddl в транзакциях


 
Игорь Шевченко ©   (2008-01-21 11:57) [4]


> Но меня больше интересует сам механизм поднятия структуры
> БД до определённой "версии схемы".


SQL-скрипт :) Или он же, встроенный в "обновлятель".


 
PEAKTOP ©   (2008-01-21 12:00) [5]

> Ega23 ©   (21.01.08 11:39) [2]

Если тебя интересует, как можно создать UpdatePack на "голом" SQL, чтобы скормить его какому-нибудь SQL-Interpretier, то можно извратиться с EXECUTE BLOCK;


SET TERM ^ ;

EXECUTE BLOCK AS
 DECLARE VARIABLE P_REL_NAME DOMN$PSTRING;
 DECLARE VARIABLE P_SQL      DOMN$PSTRING_2048;
BEGIN
 IF(NOT(EXISTS(SELECT R.RDB$RELATION_ID
               FROM   RDB$RELATIONS R
               WHERE  (TRIM(R.RDB$RELATION_NAME) = "MY_TABLE" ))))THEN
   BEGIN
   P_SQL =
     "CREATE TABLE MY_TABLE ("||
     "  ID   INTEGER "||
     " ,NAME VARCHAR(255) "||
     ")";
   EXECUTE STATEMENT P_SQL;
   END
END
^

COMMIT ^  /* ВАЖНО ВЫПОЛНЯТЬ ПОСЛЕ КАЖДОГО БЛОКА */


Идея основана на недокументированной возможности конструкции EXECUTE STATEMENT выполнять не только DML, но и DDL скрипты. А недокументированной - чтобы дети базы рабочие не укладывали :).

В следующих версиях возможность выполнять DDL через EXECUTE STATEMENT Дима Еманов обещал не сносить. В документации эта возможность отражена не будет.


 
Ega23 ©   (2008-01-21 12:02) [6]


> PEAKTOP ©   (21.01.08 12:00) [5]


О!
Похоже то, что нужно!
Спасибо!


 
turbouser ©   (2008-01-21 12:05) [7]


> По такой идеологии работаем уже достаточно давно с MSSQL.
>
> Вопрос: практикуется ли подобная схема обновления стуктуры
> БД в случае FireBird? Какие могут быть "подводные камни"?
>

У меня сделано так:
1) Делается резервная копия БД
2) Делается сравнение утилитой IBECompare от HK-Software БД пользователя с "эталонной" БД (без данных)
3) Выполняется скрипт, полученный в результате сравнения
4) Выполняются дополнительные скрипты
5) В случае каких-либо ошибок исходная БД восстанавливается
6) Сохраняется протокол обновления

Этим всем занимается отдельная программка в инсталляшке, юзеру достаточно
только указать целевую БД и ввести админский пароль.


 
PEAKTOP ©   (2008-01-21 12:14) [8]

> Ega23 ©   (21.01.08 12:02) [6]
> > PEAKTOP ©   (21.01.08 12:00) [5]
>
> О!
> Похоже то, что нужно!
> Спасибо!


Чует мое сердце: дал ребенку гранату ...


 
ZeroDivide ©   (2008-01-21 12:23) [9]

Почти так же как в Игорь Шевченко ©   (21.01.08 11:34) [1], только старый exe-шник, ругнувшись на соответствие метаданных версии клиента, все таки дает себя запустить.

Никаких отдельных прог нет. Скрипт обновляющий метаданные, а та же просто данные (если это какие-нибудь служебные справочники и их необходимо дополнить), запускается первым делом и встроен в само приложение. Т.е. первый запрос к бд после соединения - запрос на версию метаданных.

Подводных камней вроде нет. База может мутировать как угодно. Правда, обычно, если изначально была спроектирована грамотно, то drop"а практически не бывает, в основном схема БД только расширяется - этим и обусловлена возможность запуска старого экзешника на новой версии метаданных. (Хотя я пользователей предупреждаю об отказе от ответственности при порче/потере данных при таком режиме работы)


 
Desdechado ©   (2008-01-21 12:25) [10]

Подводных камней предостаточно.
Вброшу один - т.к. метаданные кэшируются при подключении, то изменение структуры БД с данными наживую может требовать переподключения в определенные моменты, например:
1. при попытке создания внешнего ключа на только что созданный первичный
2. при попытке удаления первичного ключа при только что удаленном внешнем.
Эти попытки будут неуспешными, т.к. кэш метаданных содержит устаревшую информацию.

PS
Недавно тут было обсуждение методики обновления структуры БД, поищи.


 
Игорь Шевченко ©   (2008-01-21 13:14) [11]

Desdechado ©   (21.01.08 12:25) [10]

Мы например вживую не обновляем. Ибо нефиг. Впрочем, можно поступить, как Windows - сделать обновления и сказать, что надо перезагрузиться.


 
Ega23 ©   (2008-01-21 14:03) [12]


> Мы например вживую не обновляем. Ибо нефиг. Впрочем, можно
> поступить, как Windows - сделать обновления и сказать, что
> надо перезагрузиться.
>


+1. Не стоит живое обновление геморов реализации.

Спасибо всем ответившим, выводы сделаны, буду ковыряться дальше.


 
Desdechado ©   (2008-01-21 14:07) [13]

> Мы например вживую не обновляем. Ибо нефиг.
Под "наживую" я имел в виду не при подключенных пользователях, а при наличии данных в БД (живая БД, а не болванка-прототип). Потому как при обновлении пустой БД описанные мной камни могут не проявляться.


 
Игорь Шевченко ©   (2008-01-21 14:16) [14]

Desdechado ©   (21.01.08 14:07) [13]

Данные безусловно наличествуют. Но проблем с "кешированием метаданных" мы как-то не наблюдали.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.129 c
2-1201086793
Alex_C
2008-01-23 14:13
2008.02.24
Медленное закрытие программы


11-1184062837
nikfel
2007-07-10 14:20
2008.02.24
Помогите перевести код для выключения.


8-1174430156
Константинов
2007-03-21 01:35
2008.02.24
Как выудить дополнительныую информацию о jpg файле?


2-1201778096
@!!ex
2008-01-31 14:14
2008.02.24
GetClassLongPtr что это?


4-1183993259
AlexanderMS
2007-07-09 19:00
2008.02.24
Рисование с "прозрачным" цветом.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский