Гость
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / DatabaseComparer даёт разные результаты сравнения / 4 сообщений из 4, страница 1 из 1
28.06.2016, 12:05
    #39263622
o_v_a
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DatabaseComparer даёт разные результаты сравнения
IBE 2016.5.28.1.

Есть некая целевая база. Иногда удобнее сравнивать при ручном апгрейде эталонные метаданные (скрипт) с целевой базой, а иногда саму эталонную базу с этой целевой базой.

DatabaseComparer даёт разные результаты при сравнении скрипта с базой и базы с базой, и что самое напряжное - ошибочно генерирует некоторые DDL-операторы при сравнении скрипта с базой:

Код: plsql
1.
2.
3.
CREATE PROCEDURE
...
IS_PRN /* TYPE OF COLUMN SALE.IS_PRN */ ,

- где тип?! Комментарий, запятая... Причём ряд параметров нормально представлен, ряд - нет.

Александр, я воспроизводимый пример подготовил. Ссылку в почту готов отправить.

--
"И это пройдет"
...
Рейтинг: 0 / 0
29.06.2016, 05:02
    #39264359
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DatabaseComparer даёт разные результаты сравнения
Присылай.

Но, вообще, сравнивать базу со скриптом - заведомо плохая идея. Ибо в этом случае ты сравниваешь базу с представлением о ней эксперта. Которое на практике всяко будет отличаться от представления сервера.
Хотя вот таких косяков быть не должно, конечно.
...
Рейтинг: 0 / 0
29.06.2016, 09:06
    #39264405
o_v_a
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DatabaseComparer даёт разные результаты сравнения
У нас именно сравнение скрипта эталонных метаданных с реальной базой через ibescript.dll и является самым используемым методом апгрейда баз данных пользователей при установке обновлений ПО.
У нас эталонная база весит под 20Мб. А скрипт - всего пара мегабайт текста. Два метра-то вынуть с ftp ноют с ADSL-коннектами в районах...
Так что готов тестовые скрипты и базы предоставить.
Проявилось это после объявленной кардинальной переделки компарера. Заметил с полгода назад.
На версиях IBE 2012-2013 годов таких ошибок в разностном скрипте не появляется. А также по причине того, что я использую ibescript.dll "2013 года выпуска", роботам моим этот появившийся глюк в IBE по боку.

Не то, чтобы срочно... Просто вручную иногда возникает необходимость поработать и сравнить скрипт с клиентской базой в IBExpert, если робот не справляется по каким-то причинам с подготовкой обновления.
Я, конечно, могу откатиться для таких работ на IBExpert ранних версий. Но вроде как раз для того снапшоты и ставлю более-менее свежие, чтобы вылавливать проблемы :)

Надо сегодня IBE от июня 2016 таки поставить будет. Давно уж рапортует... :)
...
Рейтинг: 0 / 0
29.06.2016, 10:05
    #39264448
o_v_a
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DatabaseComparer даёт разные результаты сравнения
Нашёл.
Проблема в моем случае возникает при формировании ALTER PROCEDURE таких процедур, у которых есть параметры, которые описаны как TYPE OF COLUMN, а соответствующие поля описаны доменами.
В этом случае при отличиях в скрипте-источнике для таких процедур формируется некорректный ALTER PROCEDURE с пустым телом в секции скрипта

Altering stored procedures (with empty bodies)

как раз в части параметров, тип которых указан как TYPE OF COLUMN - теряется тип из домена поля таблицы.

Например, была таблица с полем, описанным доменом и селективная процедура.
Извлекли метаданные.

Код: plsql
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.
CREATE DOMAIN D$BOOL AS
SMALLINT
DEFAULT 0
NOT NULL
CHECK (value between 0 and 1);

SET TERM ^ ;

CREATE PROCEDURE SELECT_NEW_TABLE
RETURNS (
    ID integer /* TYPE OF COLUMN NEW_TABLE.ID */,
    F1 SMALLINT /* TYPE OF COLUMN NEW_TABLE.F1 */ 
)
AS
BEGIN
  SUSPEND;
END^


SET TERM ; ^


CREATE TABLE NEW_TABLE (
    ID  INTEGER,
    F1  D$BOOL NOT NULL
);

SET TERM ^ ;

ALTER PROCEDURE SELECT_NEW_TABLE
RETURNS (
    F1 TYPE OF COLUMN NEW_TABLE.F1)
AS
begin
  /* Procedure Text */
  for select f1 from new_table into :f1 do
  suspend;
end^



SET TERM ; ^



Добавляем поле F2 в таблицу и в выходные параметры процедуры.
Модифицируем только эталонный скрипт - не базу. Ну, надо ж нам сэмулировать, что приплыли откуда-то актуальные метаданные, которые нам предстоит накатить на базу.
Добавляем в таблицу, в выходные параметры процедуры и в текст процедуры поле F2.
Для примера аналогичное полю F1.

Код: plsql
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.
SET TERM ^ ;

CREATE PROCEDURE SELECT_NEW_TABLE
RETURNS (
    ID integer /* TYPE OF COLUMN NEW_TABLE.ID */,
    F1 SMALLINT /* TYPE OF COLUMN NEW_TABLE.F1 */ ,
    F2 SMALLINT /* TYPE OF COLUMN NEW_TABLE.F2 */ 
)
AS
BEGIN
  SUSPEND;
END^


SET TERM ; ^


CREATE TABLE NEW_TABLE (
    ID  INTEGER,
    F1  D$BOOL NOT NULL,
    F2  D$BOOL NOT NULL
);

SET TERM ^ ;

ALTER PROCEDURE SELECT_NEW_TABLE
RETURNS (
    F1 TYPE OF COLUMN NEW_TABLE.F1,
    F2 TYPE OF COLUMN NEW_TABLE.F1)
AS
begin
  /* Procedure Text */
  for select f1, f2 from new_table into :f1, f2 do
  suspend;
end^

SET TERM ; ^



И сравнивая модифицированный скрипт с предыдущей базой получаем в разностном скрипте:

Код: plsql
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.
/******************************************************************************/
/****            Altering stored procedures (with empty bodies)            ****/
/******************************************************************************/
SET TERM ^ ;

ALTER PROCEDURE SELECT_NEW_TABLE
RETURNS (
  F1 /* TYPE OF COLUMN NEW_TABLE.F1 */ ,
  F2 /* TYPE OF COLUMN NEW_TABLE.F2 */ )
AS
BEGIN
  SUSPEND;
END
^


/******************************************************************************/
/****                      Altering stored procedures                      ****/
/******************************************************************************/
ALTER PROCEDURE SELECT_NEW_TABLE
RETURNS (
  F1 TYPE OF COLUMN NEW_TABLE.F1,
  F2 TYPE OF COLUMN NEW_TABLE.F2)
AS
begin
  /* Procedure Text */
  for select f1, f2 from new_table into :f1, :f2 do
  suspend;
end
^


SET TERM ; ^



Искомая ошибка в ALTER PROCEDURE в секции скрипта
Altering stored procedures (with empty bodies)
Потеря типа параметра.
...
Рейтинг: 0 / 0
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / DatabaseComparer даёт разные результаты сравнения / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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