Гость
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Database Comparer / 25 сообщений из 27, страница 1 из 2
09.08.2016, 13:31
    #39288887
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Database Comparer
В БД есть 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
09.08.2016, 13:34
    #39288889
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Database Comparer
В догонку:

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

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

Отличается имя PK для T1, имя FK в обеих БД одинаково.
...
Рейтинг: 0 / 0
10.08.2016, 12:23
    #39289564
max_2015
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Database Comparer
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
11.08.2016, 11:47
    #39290207
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Database Comparer
Исправил
...
Рейтинг: 0 / 0
19.08.2016, 18:59
    #39294763
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Database Comparer
Добрый день.

В 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
19.08.2016, 19:16
    #39294768
max_2015
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Database Comparer
Добавлю. В немного другой ситуации в этом примере, когда зависимости нет, и порядок полей в обеих базах одинаков, при изменении вычисляемого поля, идущего вторым и зависящего от третьего, оно пересоздаётся и становится третьим, т.е. порядок не меняется. в настройках флаг "Ignore Column Position" снят.
...
Рейтинг: 0 / 0
23.08.2016, 10:59
    #39296051
max_2015
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Database Comparer
Ещё две проблемы в одном примере:

Проблема 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
24.08.2016, 15:46
    #39297205
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Database Comparer
max_2015получаем такой скрипт, где пропущен закрывающий апостроф:


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

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

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

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

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

Потом вручную в RDB$PROCEDURE_PARAMETERS поменял первый комментарий, убрав нули.
В процедуре во вкладке "скрипт" первый комментарий стал отображаться корректно, за ним второй без закрывающего апострофа и всё.
...
Рейтинг: 0 / 0
25.08.2016, 17:13
    #39298119
noisy_by
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Database Comparer
Снова сравнение базы. Ошибка проявляется только при сравнение с файлом 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
26.08.2016, 04:33
    #39298300
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Database Comparer
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
26.08.2016, 05:23
    #39298306
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Database Comparer
max_2015что выдаёт ошибку. Нужно поменять местами удаление домена и изменение процедуры в которой он перестал использоваться.


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


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

Исправил.
...
Рейтинг: 0 / 0
30.08.2016, 10:00
    #39299983
o_v_a
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Database Comparer
Наконец-то :)
Хоть ещё кто-то напоролся - не только я. Баян же аж июньский!
http://www.sql.ru/forum/1220154/databasecomparer-dayot-raznye-rezultaty-sravneniya
Ща опробируем в бою!
P.S. Отлично. Теперь всё без ошибок!
...
Рейтинг: 0 / 0
30.08.2016, 10:13
    #39299991
o_v_a
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Database Comparer
P.P.S.
Авотфиг! Проблема остается, если поля таблицы описаны не типами, а доменами!
Ща подготовлю набор для теста.
...
Рейтинг: 0 / 0
30.08.2016, 10:31
    #39300024
o_v_a
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Database Comparer
База из 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
30.08.2016, 12:30
    #39300188
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Database Comparer
o_v_aЩа опробируем в бою!
P.S. Отлично. Теперь всё без ошибок!

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


Вот сейчас можно воевать.
...
Рейтинг: 0 / 0
30.08.2016, 16:39
    #39300433
o_v_a
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Database Comparer
СПАСИБО!!! Проверил - всё хорошо!
...
Рейтинг: 0 / 0
31.08.2016, 16:26
    #39301274
max_2015
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Database Comparer
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
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Database Comparer / 25 сообщений из 27, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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