powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / DatabaseComparer даёт разные результаты сравнения
4 сообщений из 4, страница 1 из 1
DatabaseComparer даёт разные результаты сравнения
    #39263622
Фотография o_v_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBE 2016.5.28.1.

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

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

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

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

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

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

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

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

Надо сегодня IBE от июня 2016 таки поставить будет. Давно уж рапортует... :)
...
Рейтинг: 0 / 0
DatabaseComparer даёт разные результаты сравнения
    #39264448
Фотография o_v_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашёл.
Проблема в моем случае возникает при формировании 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
4 сообщений из 4, страница 1 из 1
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / DatabaseComparer даёт разные результаты сравнения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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