Гость
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Сравнение триггеров вьюх / 4 сообщений из 4, страница 1 из 1
28.10.2020, 18:25
    #40012795
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение триггеров вьюх
При сравнении структур двух баз для триггеров подвязаных к view не создается заглушка
Код: sql
1.
2.
3.
4.
5.
ALTER TRIGGER TR_VW_TEST_BIU0
AS
BEGIN
  EXIT;
END


В итоге, если у view пропало поле, которое использовалось в триггере, то возникает ошибка при ALTER VIEW

С уважением, Vasilisk
...
Рейтинг: 0 / 0
29.10.2020, 08:20
    #40012947
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение триггеров вьюх
Нужны скрипты баз для тест-кейза. Сам я их придумывать не буду.
...
Рейтинг: 0 / 0
29.10.2020, 13:37
    #40013021
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение триггеров вьюх
IBExpert
Нужны скрипты баз

Target.fdb
Код: 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.
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.
/******************************************************************************/
/***         Generated by IBExpert 2020.10.19.1 29.10.2020 12:27:02         ***/
/******************************************************************************/

/******************************************************************************/
/***      Following SET SQL DIALECT is just for the Database Comparer       ***/
/******************************************************************************/
SET SQL DIALECT 3;



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



CREATE TABLE "TEST" (
    "ID"       INTEGER NOT NULL,
    "VAL_INT"  INTEGER,
    "VAL_STR"  INTEGER
);




/******************************************************************************/
/***                                 Views                                  ***/
/******************************************************************************/


/* View: "VW_TEST" */
CREATE VIEW "VW_TEST"(
    "ID",
    "VAL_INT",
    "VAL_STR")
AS
SELECT
  t.id,
  t.val_int,
  t.val_str
FROM
  test t
;




/******************************************************************************/
/***                              Primary keys                              ***/
/******************************************************************************/

ALTER TABLE "TEST" ADD CONSTRAINT "PK_TEST" PRIMARY KEY ("ID");


/******************************************************************************/
/***                                Triggers                                ***/
/******************************************************************************/



SET TERM ^ ;



/******************************************************************************/
/***                      Triggers for updatable views                      ***/
/******************************************************************************/



/* Trigger: "TR_VW_TEST_BI0" */
CREATE TRIGGER "TR_VW_TEST_BI0" FOR "VW_TEST"
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  POST_EVENT 'DUMMY_EVENT';
END
^


ALTER TRIGGER "TR_VW_TEST_BI0"
AS
BEGIN
  INSERT INTO test (
    id,
    val_int,
    val_str
  ) VALUES (
    NEW.id,
    NEW.val_int,
    NEW.val_str
  );
END
^

SET TERM ; ^


Source.fdb
Код: 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.
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.
/******************************************************************************/
/***         Generated by IBExpert 2020.10.19.1 29.10.2020 12:24:39         ***/
/******************************************************************************/

/******************************************************************************/
/***      Following SET SQL DIALECT is just for the Database Comparer       ***/
/******************************************************************************/
SET SQL DIALECT 3;



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



CREATE TABLE "TEST" (
    "ID"       INTEGER NOT NULL,
    "VAL_INT"  INTEGER,
    "VAL_STR"  INTEGER
);




/******************************************************************************/
/***                                 Views                                  ***/
/******************************************************************************/


/* View: "VW_TEST" */
CREATE VIEW "VW_TEST"(
    "ID",
    "VAL_STR")
AS
SELECT
  t.id,
  t.val_str
FROM
  test t
;




/******************************************************************************/
/***                              Primary keys                              ***/
/******************************************************************************/

ALTER TABLE "TEST" ADD CONSTRAINT "PK_TEST" PRIMARY KEY ("ID");


/******************************************************************************/
/***                                Triggers                                ***/
/******************************************************************************/



SET TERM ^ ;



/******************************************************************************/
/***                      Triggers for updatable views                      ***/
/******************************************************************************/



/* Trigger: "TR_VW_TEST_BI0" */
CREATE TRIGGER "TR_VW_TEST_BI0" FOR "VW_TEST"
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  POST_EVENT 'DUMMY_EVENT';
END
^


ALTER TRIGGER "TR_VW_TEST_BI0"
AS
BEGIN
  INSERT INTO test (
    id,
    val_str
  ) VALUES (
    NEW.id,
    NEW.val_str
  );
END
^

SET TERM ; ^

Из вьюхи пропало поле val_int.

Запускаем сравнение баз с включенной опцией Alter views instead DROP/CREATE
Все опции сравнения
Код: 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.
execute ibeblock
as
begin
  cbb = 'execute ibeblock (LogMessage variant)
         as
         begin
           ibec_progress(LogMessage);
         end';

  SourceDB = ibec_CreateConnection(__ctInterBase, 
                                   'DBName="Server2:D:\DB\TEMP\Source.fdb";
                                   ClientLib=fbclient.dll;
                                   User=SYSDBA; Password=masterkey; Names=WIN1251; SqlDialect=3');
  TargetDB = ibec_CreateConnection(__ctInterBase, 
                                   'DBName="Server2:D:\DB\Temp\Target.fdb";
                                   ClientLib=fbclient.dll;
                                   User=SYSDBA; Password=masterkey; Names=WIN1251; SqlDialect=3');
  try
    ibec_CompareMetadata(SourceDB, TargetDB,
                         '', -- Don't forget to specify file name for the result script
                         'ServerVersion=FB30;
                          OmitGrants;
                          SafeDatatypeConversion;
                          IgnoreIBEObjects;
                          DescriptionMode=COMMENT;
                          AlterViews', 
                         cbb);
  finally
    ibec_CloseConnection(TargetDB);
    ibec_CloseConnection(SourceDB);
  end;
end;


Получившийся скрипт
Код: 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.
/* Server version: WI-V6.3.6.33328 Firebird 3.0 
   SQLDialect: 3. ODS: 12.0. Forced writes: On. Sweep interval: 20000.
   Page size: 16384. Cache pages: 256 (4096 Kb). Read-only: False. */
SET CLIENTLIB 'fbclient.dll';
SET NAMES WIN1251;

SET SQL DIALECT 3;

CONNECT 'Server2:D:\DB\Temp\Target.fdb' USER 'SYSDBA' PASSWORD 'masterkey';

SET AUTODDL ON;

/******************************************************************************/
/****                 Deactivating dependencies of objects                 ****/
/******************************************************************************/
ALTER VIEW VW_TEST (
    ID,
    VAL_INT,
    VAL_STR)
AS
SELECT
    CAST(NULL AS INTEGER),
    CAST(NULL AS INTEGER),
    CAST(NULL AS INTEGER)
FROM RDB$DATABASE;


/******************************************************************************/
/****                       Creating/altering views                        ****/
/******************************************************************************/
ALTER VIEW VW_TEST (
    ID,
    VAL_STR)
AS
SELECT
  t.id,
  t.val_str
FROM
  test t;


/******************************************************************************/
/****                          Altering triggers                           ****/
/******************************************************************************/
SET TERM ^ ;

ALTER TRIGGER TR_VW_TEST_BI0
AS
BEGIN
  INSERT INTO test (
    id,
    val_str
  ) VALUES (
    NEW.id,
    NEW.val_str
  );
END
^


SET TERM ; ^

Вначале идет ALTER VIEW с удалением поля, и только потом модификация триггера.

Для таблиц, в таких случаях, перед ALTER TABLE вставляется блок-заглушка для триггера
Код: sql
1.
2.
3.
4.
5.
ALTER TRIGGER TR_VW_TEST_BI0
AS
BEGIN
  EXIT;
END
...
Рейтинг: 0 / 0
02.11.2020, 04:27
    #40014092
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение триггеров вьюх
Исправил.
...
Рейтинг: 0 / 0
Форумы / IBExpert [игнор отключен] [закрыт для гостей] / Сравнение триггеров вьюх / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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