powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Database Comparer
25 сообщений из 27, страница 1 из 2
Database Comparer
    #39288887
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В БД есть 2 таблицы.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE T1 (
    ID   INTEGER NOT NULL,
    VAL  VARCHAR(10)
);

CREATE TABLE T2 (
    ID   INTEGER NOT NULL,
    FID  INTEGER
);

ALTER TABLE T1 ADD CONSTRAINT PK_T1 PRIMARY KEY (ID);
ALTER TABLE T2 ADD CONSTRAINT PK_T2 PRIMARY KEY (ID);

ALTER TABLE T2 ADD CONSTRAINT FK_T2_1 FOREIGN KEY (FID) REFERENCES T1 (ID);


По полю T2.FID наложен FK на таблицу T1.ID

Есть копия БД, в которой отличается имя PK таблицы T1 (в другой БД он называется PK_T1):
Код: plsql
1.
ALTER TABLE T1 ADD CONSTRAINT PK_T10 PRIMARY KEY (ID);



Database Comparer выдает скрипт:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
/******************************************************************************/
/****                   Dropping primary key constraints                   ****/
/******************************************************************************/
RECONNECT;

ALTER TABLE T1 DROP CONSTRAINT PK_T10;


/******************************************************************************/
/****                   Creating primary key constraints                   ****/
/******************************************************************************/
RECONNECT;

ALTER TABLE T1 ADD CONSTRAINT PK_T1 PRIMARY KEY (ID);



Но удалить PK для его пересоздания нельзя, пока есть FK.

С уважением, Polesov.
...
Рейтинг: 0 / 0
Database Comparer
    #39288889
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В догонку:

- версия IBE 2016.8.9.1
- отличается имя индекса PK
...
Рейтинг: 0 / 0
Database Comparer
    #39289370
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov- отличается имя индекса PK

Уточни: имя ограничения в обеих базах одно и то же?
...
Рейтинг: 0 / 0
Database Comparer
    #39289550
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert,

Отличается имя PK для T1, имя FK в обеих БД одинаково.
...
Рейтинг: 0 / 0
Database Comparer
    #39289564
max_2015
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpertPolesov- отличается имя индекса PK

Уточни: имя ограничения в обеих базах одно и то же?

в нашем реальном примере отличалось имя ИНДЕКСА первичного ключа, а имя САМОГО пк совпадало.

А в показанном выше тестовом примере так:

в базе1:
ALTER TABLE T1 ADD CONSTRAINT PK_T1 PRIMARY KEY (ID);

в базе2:
ALTER TABLE T1 ADD CONSTRAINT PK_T10 PRIMARY KEY (ID);

всё остальное совпадает.

и в том и в другом случае компарер не генерит никаких действий с FK_T2_1.
Кстати, в версии 2014 года всё работает правильно.
...
Рейтинг: 0 / 0
Database Comparer
    #39290207
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправил
...
Рейтинг: 0 / 0
Database Comparer
    #39294763
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

В 2-х одинаковых БД есть таблица:
Код: plsql
1.
2.
3.
4.
5.
CREATE TABLE T (
    ID     INTEGER NOT NULL,
    VAL    INTEGER,
    C_VAL  COMPUTED BY (( '#' || VAL )),
);



В БД 1 меняем вычисляемое поле:
Код: plsql
1.
ALTER TABLE T ALTER C_VAL COMPUTED BY (( '#<' || VAL || '>' ));


и порядок полей:
Код: plsql
1.
ALTER TABLE T ALTER C_VAL POSITION 3;



В БД 2 делаем зависимость в процедуре на вычисляемое поле:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SET TERM ^ ;

CREATE OR ALTER PROCEDURE P
RETURNS (
    VAL VARCHAR(100))
AS
BEGIN
  SELECT FIRST(1) C_VAL
    FROM T
    INTO :VAL;
  SUSPEND;
END^

SET TERM ; ^



Компарер выдает такой скрипт:
Код: plsql
1.
2.
3.
4.
5.
ALTER TABLE T DROP C_VAL;

ALTER TABLE T ADD C_VAL /* VARCHAR(14) */ COMPUTED BY (('#<' || VAL || '>' ));

ALTER TABLE T ALTER C_VAL POSITION 3;



Во 2-й БД не учитывается зависимость поля C_VAL - первая строка скрипта вызовет ошибку.

С уважением, Polesov.
...
Рейтинг: 0 / 0
Database Comparer
    #39294768
max_2015
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добавлю. В немного другой ситуации в этом примере, когда зависимости нет, и порядок полей в обеих базах одинаков, при изменении вычисляемого поля, идущего вторым и зависящего от третьего, оно пересоздаётся и становится третьим, т.е. порядок не меняется. в настройках флаг "Ignore Column Position" снят.
...
Рейтинг: 0 / 0
Database Comparer
    #39296051
max_2015
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ещё две проблемы в одном примере:

Проблема 1:

База DB1:

Код: sql
1.
2.
CREATE DOMAIN D2 AS
INTEGER;



Код: sql
1.
2.
3.
4.
5.
6.
7.
create or alter procedure new_procedure
returns (
    a d2)
as
begin
  suspend;
end



База DB2:

Код: sql
1.
2.
CREATE DOMAIN D1 AS INTEGER;
CREATE DOMAIN D2 AS INTEGER;



Код: sql
1.
2.
3.
4.
5.
6.
7.
create or alter procedure new_procedure
returns (
    a d1)
as
begin
  suspend;
end



Сравниваем компарером D1 => D2 и получаем:

Код: sql
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.
/* Server version: WI-V6.3.6.27020 Firebird 2.5 
   SQLDialect: 3. ODS: 11.2. Forced writes: On. Sweep interval: 20000.
   Page size: 16384. Cache pages: 75 (1200 Kb). Read-only: False. */
SET CLIENTLIB 'C:\Firebird\Firebird_2_5\bin\fbclient.dll';
SET NAMES WIN1251;

SET SQL DIALECT 3;

CONNECT 'D:\_db\test\DB2.FDB' USER 'SYSDBA' PASSWORD 'masterkey';

SET AUTODDL ON;

/******************************************************************************/
/****                           Dropping domains                           ****/
/******************************************************************************/
DROP DOMAIN D1;


/******************************************************************************/
/****                      Altering stored procedures                      ****/
/******************************************************************************/
SET TERM ^ ;

ALTER PROCEDURE NEW_PROCEDURE
RETURNS (
  A D2)
AS
begin
  suspend;
end
^



что выдаёт ошибку. Нужно поменять местами удаление домена и изменение процедуры в которой он перестал использоваться.

Проблема 2:

комментарии к параметру процедуры. Если в конце к "нормальному" тексту комментария в одной из баз добавлены нулевые символы, то, во-первых, компарер видит, что комментарии различны (и это, в принципе, правильно), и во-вторых, теряется закрывающий апостроф!

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

DB1:
Код: sql
1.
2.
3.
UPDATE RDB$PROCEDURE_PARAMETERS r SET r.RDB$DESCRIPTION = 'aa' || ascii_char(0)
WHERE trim(r.RDB$PROCEDURE_NAME) =  'NEW_PROCEDURE'
and trim(r.RDB$PARAMETER_NAME) = 'A'



DB2:
Код: sql
1.
2.
3.
UPDATE RDB$PROCEDURE_PARAMETERS r SET r.RDB$DESCRIPTION = 'aa'
WHERE trim(r.RDB$PROCEDURE_NAME) =  'NEW_PROCEDURE'
and trim(r.RDB$PARAMETER_NAME) = 'A'



получаем такой скрипт, где пропущен закрывающий апостроф:
Код: sql
1.
2.
3.
4.
5.
6.
7.
/******************************************************************************/
/****                       Updating object comments                       ****/
/******************************************************************************/
SET TERM ; ^

COMMENT ON PARAMETER NEW_PROCEDURE.A IS
'aa;
...
Рейтинг: 0 / 0
Database Comparer
    #39297205
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
max_2015получаем такой скрипт, где пропущен закрывающий апостроф:


Нулевой символ в тексте трактуется редактором как конец всему и вообще, за ним жизни нет. Как нулевые символы в комментарии попадают - это не к эксперту вопрос.

Остальное еще не смотрел.
...
Рейтинг: 0 / 0
Database Comparer
    #39297638
max_2015
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpertНулевой символ в тексте трактуется редактором как конец всему и вообще, за ним жизни нет. Как нулевые символы в комментарии попадают - это не к эксперту вопрос.
Но точку с запятой он после этой незакрытой апострофом строки ставит. Т.е. дело не в редакторе, в котором просматривается скрипт, а в формировании строки.

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

А откуда они берутся, мы ещё не разобрались.
...
Рейтинг: 0 / 0
Database Comparer
    #39297737
max_2015
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
IBExpert,

Зашёл в проблемную процедуру, ситуация следующая: У нескольких параметров есть комментарии, все они содержат нули в конце.
В "Ленивом режиме" они все видны, а если перейти на вкладку "скрипт", то там внизу отображается только первый комментарий без закрывающего апострофа и всё. Т.е. тут - да, для редактора конец всему...

Потом вручную в RDB$PROCEDURE_PARAMETERS поменял первый комментарий, убрав нули.
В процедуре во вкладке "скрипт" первый комментарий стал отображаться корректно, за ним второй без закрывающего апострофа и всё.
...
Рейтинг: 0 / 0
Database Comparer
    #39298119
noisy_by
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Снова сравнение базы. Ошибка проявляется только при сравнение с файлом sql

master.sql
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SET SQL DIALECT 3;
CREATE DOMAIN D_NAME AS VARCHAR(50) NOT NULL;
CREATE DOMAIN UID AS INTEGER NOT NULL;

SET TERM ^ ;
CREATE OR ALTER PROCEDURE CHANNELS_DEL (CH_ID INTEGER /* TYPE OF COLUMN CHANNELS.CH_ID */)
AS BEGIN
  EXIT;
END^
SET TERM ; ^

CREATE TABLE CHANNELS ( CH_ID UID, CH_NAME D_NAME );

SET TERM ^ ;
CREATE OR ALTER PROCEDURE CHANNELS_DEL (CH_ID TYPE OF COLUMN CHANNELS.CH_ID)
AS begin
  delete from Channels c where c.Ch_Id = :Ch_Id;
end^
SET TERM ; ^



slave.sql
Код: sql
1.
2.
3.
4.
SET SQL DIALECT 3;
CREATE DOMAIN D_NAME AS VARCHAR(50) NOT NULL;
CREATE DOMAIN UID AS INTEGER NOT NULL;
CREATE TABLE CHANNELS ( CH_ID UID, CH_NAME D_NAME );



результат
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SET SQL DIALECT 3;
SET AUTODDL ON;
SET TERM ^ ;

CREATE PROCEDURE CHANNELS_DEL(CH_ID /* TYPE OF COLUMN CHANNELS.CH_ID */ )
AS
BEGIN
  EXIT;
END
^

ALTER PROCEDURE CHANNELS_DEL(CH_ID TYPE OF COLUMN CHANNELS.CH_ID)
AS
begin
  delete from Channels c where c.Ch_Id = :Ch_Id;
end
^
SET TERM ; ^



ошибка в
Код: sql
1.
CREATE PROCEDURE CHANNELS_DEL(CH_ID /* TYPE OF COLUMN CHANNELS.CH_ID */ )


т.е. нет типа integer
...
Рейтинг: 0 / 0
Database Comparer
    #39298300
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovВо 2-й БД не учитывается зависимость поля C_VAL - первая строка скрипта вызовет ошибку.


Во-первых, какая версия эксперта?
Во-вторых, сравниваются БД или скрипты или БД со скриптами?
В-третьих, нельзя ли целиком скрипты для тест-кейзов предоставлять, чтобы я не парился?

Я попытался воспроизвести проблему по описанию:

Код: sql
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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
-- http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1227465&msg=19565330

-- First (master) database

SET NAMES utf8;

SET sql dialect 3;

SET clientlib 'D:\Projects_5\IBExpert\ClientLibs\fbclient_30.dll';

CREATE DATABASE 'AVX-LENOVO/3052:D:\DATA\FB30_DATA\CMP\FOR_TESTS_1.FDB'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 8192
DEFAULT CHARACTER SET utf8;



CREATE TABLE T (
    ID     INTEGER NOT NULL,
    VAL    INTEGER,
    C_VAL  COMPUTED BY (( '#' || VAL ))
);

ALTER TABLE T ALTER C_VAL COMPUTED BY (( '#<' || VAL || '>' ));
ALTER TABLE T ALTER C_VAL POSITION 3;


-- Second (target) database

SET NAMES utf8;

SET sql dialect 3;

SET clientlib 'D:\Projects_5\IBExpert\ClientLibs\fbclient_30.dll';

CREATE DATABASE 'AVX-LENOVO/3052:D:\DATA\FB30_DATA\CMP\FOR_TESTS_2.FDB'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 8192
DEFAULT CHARACTER SET utf8;


CREATE TABLE T (
    ID     INTEGER NOT NULL,
    VAL    INTEGER,
    C_VAL  COMPUTED BY (( '#' || VAL ))
);

SET TERM ^ ;

CREATE OR ALTER PROCEDURE P
RETURNS (
    VAL VARCHAR(100))
AS
BEGIN
  SELECT FIRST(1) C_VAL
    FROM T
    INTO :VAL;
  SUSPEND;
END^

SET TERM ; ^



Компарер выдал следующий скрипт (образцовая - вторая БД):

Код: sql
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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
SET CLIENTLIB 'D:\Projects_5\IBExpert\ClientLibs\fbclient_30.dll';
SET NAMES UTF8;

SET SQL DIALECT 3;

CONNECT 'AVX-LENOVO/3052:D:\DATA\FB30_DATA\CMP\FOR_TESTS_1.FDB' USER 'SYSDBA' PASSWORD 'masterkey';

SET AUTODDL ON;

/******************************************************************************/
/****                      Creating stored procedures                      ****/
/******************************************************************************/
SET TERM ^ ;

CREATE PROCEDURE P
RETURNS (
  VAL VARCHAR(100))
AS
BEGIN
  SUSPEND;
END
^


/******************************************************************************/
/****                           Altering tables                            ****/
/******************************************************************************/
SET TERM ; ^

ALTER TABLE T DROP C_VAL;

ALTER TABLE T ADD C_VAL /* VARCHAR(48) */ COMPUTED BY (( '#' || VAL ));


/******************************************************************************/
/****                      Altering stored procedures                      ****/
/******************************************************************************/
SET TERM ^ ;

ALTER PROCEDURE P
RETURNS (
  VAL VARCHAR(100))
AS
BEGIN
  SELECT FIRST(1) C_VAL
    FROM T
    INTO :VAL;
  SUSPEND;
END
^

SET TERM ; ^


И после выполнения этого скрипта компарер, естественно, различий не находит.
...
Рейтинг: 0 / 0
Database Comparer
    #39298306
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
max_2015что выдаёт ошибку. Нужно поменять местами удаление домена и изменение процедуры в которой он перестал использоваться.


Это исправил.
...
Рейтинг: 0 / 0
Database Comparer
    #39298309
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
max_2015Предлагаю вставить удаление нулевых символов из комментариев, если они встречаются.


Ну, нет. Не буду я этим заниматься, наверное.
Это надо в сотне мест, где RDB$DESCRIPTION читается, соответствующие правки делать, это раз.
Почему удалять, а не на пробелы, например, заменять? Это два.
Если в базе есть нули в комментах - они всплывут где-нибудь еще, не обязательно в эксперте. Это три.
...
Рейтинг: 0 / 0
Database Comparer
    #39299945
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
noisy_byт.е. нет типа integer

Исправил.
...
Рейтинг: 0 / 0
Database Comparer
    #39299983
Фотография o_v_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наконец-то :)
Хоть ещё кто-то напоролся - не только я. Баян же аж июньский!
http://www.sql.ru/forum/1220154/databasecomparer-dayot-raznye-rezultaty-sravneniya
Ща опробируем в бою!
P.S. Отлично. Теперь всё без ошибок!
...
Рейтинг: 0 / 0
Database Comparer
    #39299991
Фотография o_v_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.P.S.
Авотфиг! Проблема остается, если поля таблицы описаны не типами, а доменами!
Ща подготовлю набор для теста.
...
Рейтинг: 0 / 0
Database Comparer
    #39300024
Фотография o_v_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
База из 1 домена, 1 таблицы с 1 полем и 1 селективной процедурой
1) Создайте базу из этого скрипта.

Код: 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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
/******************************************************************************/
/***         Generated by IBExpert 2016.8.29.1 30.08.2016 10:14:14          ***/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES WIN1251;

CREATE DATABASE 'D:\BASES\111.FDB'
USER 'SYSDBA'
PAGE_SIZE 16384
DEFAULT CHARACTER SET WIN1251 COLLATION WIN1251;



/******************************************************************************/
/***                                Domains                                 ***/
/******************************************************************************/

CREATE DOMAIN D$BOOL AS
INTEGER
DEFAULT 0
NOT NULL;



/******************************************************************************/
/***                           Stored procedures                            ***/
/******************************************************************************/



SET TERM ^ ;

CREATE PROCEDURE T1_SEL
RETURNS (
    F1 INTEGER /* TYPE OF COLUMN T1.F1 */)
AS
BEGIN
  SUSPEND;
END^






SET TERM ; ^



/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/



CREATE TABLE T1 (
    F1  D$BOOL
);




/******************************************************************************/
/***                           Stored procedures                            ***/
/******************************************************************************/



SET TERM ^ ;

ALTER PROCEDURE T1_SEL
RETURNS (
    F1 TYPE OF COLUMN T1.F1)
AS
begin
  for select f1
      from t1
      into :f1
  do
  begin
    suspend;
  end
end^



SET TERM ; ^



/******************************************************************************/
/***                               Privileges                               ***/
/******************************************************************************/


/* Privileges of procedures */
GRANT SELECT ON T1 TO PROCEDURE T1_SEL;




2) Скрипт другой базы. Та же 1 таблица, но полей в ней уже 2 и та же 1 селективная процедура, но с 2 параметрами.

Код: 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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
/******************************************************************************/
/***         Generated by IBExpert 2016.8.29.1 30.08.2016 10:23:50          ***/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES WIN1251;

CREATE DATABASE 'D:\BASES\111.FDB'
USER 'SYSDBA'
PAGE_SIZE 16384
DEFAULT CHARACTER SET WIN1251 COLLATION WIN1251;

CREATE DOMAIN D$BOOL AS INTEGER DEFAULT 0 NOT NULL;

/******************************************************************************/
/***                           Stored procedures                            ***/
/******************************************************************************/



SET TERM ^ ;

CREATE PROCEDURE T1_SEL
RETURNS (
    F1 INTEGER /* TYPE OF COLUMN T1.F1 */,
    F2 INTEGER /* TYPE OF COLUMN T1.F2 */)
AS
BEGIN
  SUSPEND;
END^






SET TERM ; ^



/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/



CREATE TABLE T1 (
    F1  D$BOOL,
    F2  D$BOOL
);




/******************************************************************************/
/***                           Stored procedures                            ***/
/******************************************************************************/



SET TERM ^ ;

ALTER PROCEDURE T1_SEL
RETURNS (
    F1 TYPE OF COLUMN T1.F1,
    F2 TYPE OF COLUMN T1.F2)
AS
begin
  for select f1, f2
      from t1
      into :f1, :f2
  do
  begin
    suspend;
  end
end^



SET TERM ; ^



/******************************************************************************/
/***                               Privileges                               ***/
/******************************************************************************/


/* Privileges of procedures */
GRANT SELECT ON T1 TO PROCEDURE T1_SEL;


Базу со второго скрипта создавать не надо.
Запускаем сравнение баз. И сравниваем источник-скрипт 2 с базой назначения 1.
Получаем неверный разностный скрипт с

ALTER PROCEDURE T1_SEL
RETURNS (
--НЕТ ТИПА ПАРАМЕТРОВ
F1 /* TYPE OF COLUMN T1.F1 */ ,
F2 /* TYPE OF COLUMN T1.F2 */ )
AS
BEGIN
SUSPEND;
END
^


Код: 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.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
/* Server version: WI-V6.3.4.26856 Firebird 2.5 
   SQLDialect: 3. ODS: 11.2. Forced writes: On. Sweep interval: 20000.
   Page size: 16384. Cache pages: 2048 (32768 Kb). Read-only: False. */
SET NAMES WIN1251;

SET SQL DIALECT 3;

CONNECT 'D:\BASES\111.FDB' USER 'sysdba' PASSWORD '1';

SET AUTODDL ON;

/******************************************************************************/
/****                 Deactivating dependencies of objects                 ****/
/******************************************************************************/
SET TERM ^ ;

ALTER PROCEDURE T1_SEL
RETURNS (
  F1 /* TYPE OF COLUMN T1.F1 */ INTEGER)
AS
BEGIN
  SUSPEND;
END
^


/******************************************************************************/
/****                           Creating domains                           ****/
/******************************************************************************/
SET TERM ; ^

CREATE DOMAIN D$BOOL
AS INTEGER DEFAULT 0 NOT NULL;


/******************************************************************************/
/****                           Altering tables                            ****/
/******************************************************************************/
ALTER TABLE T1
  ADD F2 D$BOOL;

ALTER TABLE T1 ALTER COLUMN F1
  TYPE D$BOOL;


/******************************************************************************/
/****            Altering stored procedures (with empty bodies)            ****/
/******************************************************************************/
SET TERM ^ ;

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


/******************************************************************************/
/****                      Altering stored procedures                      ****/
/******************************************************************************/
ALTER PROCEDURE T1_SEL
RETURNS (
  F1 TYPE OF COLUMN T1.F1,
  F2 TYPE OF COLUMN T1.F2)
AS
begin
  for select f1, f2
      from t1
      into :f1, :f2
  do
  begin
    suspend;
  end
end
^


SET TERM ; ^


...
Рейтинг: 0 / 0
Database Comparer
    #39300188
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
o_v_aЩа опробируем в бою!
P.S. Отлично. Теперь всё без ошибок!

Ничоси! А ведь даже еще не выкладывал пофиксенную версию... А оно само! Ничоси!
...
Рейтинг: 0 / 0
Database Comparer
    #39300258
Фотография o_v_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот с доменами пофиксишь - будет "ничоси"! :)
...
Рейтинг: 0 / 0
Database Comparer
    #39300408
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
o_v_aЩа опробируем в бою!


Вот сейчас можно воевать.
...
Рейтинг: 0 / 0
Database Comparer
    #39300433
Фотография o_v_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СПАСИБО!!! Проверил - всё хорошо!
...
Рейтинг: 0 / 0
Database Comparer
    #39301274
max_2015
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PolesovДобрый день.

В 2-х одинаковых БД есть таблица:
Код: plsql
1.
2.
3.
4.
5.
CREATE TABLE T (
    ID     INTEGER NOT NULL,
    VAL    INTEGER,
    C_VAL  COMPUTED BY (( '#' || VAL )),
);



В БД 1 меняем вычисляемое поле:
Код: plsql
1.
ALTER TABLE T ALTER C_VAL COMPUTED BY (( '#<' || VAL || '>' ));


и порядок полей:
Код: plsql
1.
ALTER TABLE T ALTER C_VAL POSITION 3;



В БД 2 делаем зависимость в процедуре на вычисляемое поле:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SET TERM ^ ;

CREATE OR ALTER PROCEDURE P
RETURNS (
    VAL VARCHAR(100))
AS
BEGIN
  SELECT FIRST(1) C_VAL
    FROM T
    INTO :VAL;
  SUSPEND;
END^

SET TERM ; ^



Компарер выдает такой скрипт:
Код: plsql
1.
2.
3.
4.
5.
ALTER TABLE T DROP C_VAL;

ALTER TABLE T ADD C_VAL /* VARCHAR(14) */ COMPUTED BY (('#<' || VAL || '>' ));

ALTER TABLE T ALTER C_VAL POSITION 3;



Во 2-й БД не учитывается зависимость поля C_VAL - первая строка скрипта вызовет ошибку.

С уважением, Polesov.
тут забыли указать самую важную вещь: в Options флаг "Procedures" снят! Именно тогда такое происходит.
Но этот флаг должен по идее обозначать то, что не нужно менять отличающиеся процедуры. Но в данном случае процедура не отличается, а её временное изменение и потом обратно требуется в технических целях (по сути, внутренние цели компарера, не влияющие на конечный результат для пользователя), поэтому технические действия с процедурой должны выполняться в любом случае.

Версия Firebird - 2.5.6
Версия IBExpert - 2016.8.9.1
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Database Comparer
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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