Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / IBExpert Новый топик    Ответить
 Сравнение триггеров вьюх  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12343
При сравнении структур двух баз для триггеров подвязаных к view не создается заглушка
ALTER TRIGGER TR_VW_TEST_BIU0
AS
BEGIN
  EXIT;
END

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

С уважением, Vasilisk
28 окт 20, 18:25    [22222523]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение триггеров вьюх  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
Нужны скрипты баз для тест-кейза. Сам я их придумывать не буду.
29 окт 20, 08:20    [22222746]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение триггеров вьюх  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12343
IBExpert
Нужны скрипты баз

+ Target.fdb
/******************************************************************************/
/***         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
/******************************************************************************/
/***         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
+ Все опции сравнения
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;

+ Получившийся скрипт
/* 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 вставляется блок-заглушка для триггера
ALTER TRIGGER TR_VW_TEST_BI0
AS
BEGIN
  EXIT;
END
29 окт 20, 13:37    [22222886]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение триггеров вьюх  [new]
IBExpert
Member

Откуда: От верблюда
Сообщений: 3331
Исправил.
2 ноя 20, 04:27    [22224577]     Ответить | Цитировать Сообщить модератору
Все форумы / IBExpert Ответить