DB2 триггер обновления и вставки, ссылается на множество полей, которые я могу использовать *, чтобы сократить их (в iSeries, но это может не иметь значения) - PullRequest
0 голосов
/ 10 августа 2011

DB2 на iSeries немного отличается от DB2 от других платформ, но, как я уже сказал, это может не иметь значения.

Вот мои следующие триггеры (которые работают) (Одно из отличий заключается в использовании '/' vs '.' В зависимости от того, какой инструмент используется для создания запроса)

create trigger utbachInsert after insert on CO99PR/UTBACH  
 referencing new as n                                               
 for each row mode db2sql                                           
 begin atomic   
    insert into CO99PRH/UTBACH values(
 n.BCGRP, n.BCID,n.BCSTAT,n.BCDESC,n.YYRGDT,      
 n.MMRGDT,n.DDRGDT,n.YY1EDT,n.MM1EDT,n.DD1EDT,    
 n.YYBLDT,n.MMBLDT,n.DDBLDT,n.YYPSDT,n.MMPSDT,    
 n.DDPSDT,n.YYPGDT,n.MMPGDT,n.DDPGDT,n.BCCOMM,    
 n.BCUSER,n.YYDATE,n.MMDATE,n.DDDATE    
);                                                                                          
end 

create trigger utbachUpdate after update on CO99PR/UTBACH  
 referencing new as n                                               
 for each row mode db2sql                                           
 begin atomic   
    update CO99PRH/UTBACH set 
        BCGRP = n.BCGRP, 
        BCID = n.BCID,
        BCSTAT = n.BCSTAT,
        BCDESC = n.BCDESC,
        YYRGDT = n.YYRGDT,      
        MMRGDT = n.MMRGDT,
        DDRGDT = n.DDRGDT,
        YY1EDT = n.YY1EDT,
        MM1EDT = n.MM1EDT,
        DD1EDT = n.DD1EDT,    
        YYBLDT = n.YYBLDT,
        MMBLDT = n.MMBLDT,
        DDBLDT = n.DDBLDT,
        YYPSDT = n.YYPSDT,
        MMPSDT = n.MMPSDT,    
        DDPSDT = n.DDPSDT,
        YYPGDT = n.YYPGDT,
        MMPGDT = n.MMPGDT,
        DDPGDT = n.DDPGDT,
        BCCOMM = n.BCCOMM,    
        BCUSER = n.BCUSER,
        YYDATE = n.YYDATE,
        MMDATE = n.MMDATE,
        DDDATE = n.DDDATE;                                                  
end 

Просто в вышеприведенных блоках мне нужно много печатать, я уверен, что использовал оператор SELECT для получения записей, которые мне нужны для другого триггера вставки, и поскольку это был оператор SELECT, я мог использовать table1. * (присоединился к другому столу). Поскольку n ссылается на старую строку, я надеялся, что смогу сказать n. * Или что-то в этом роде.

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

PS : Иногда полезно иметь контекст, я делаю это для набора таблиц, чтобы синхронизировать их содержимое (в одном направлении). Таблицы используются программами, которые используют доступ на уровне записей (до использования SQL в DB2), и изменение таблиц часто означает перекомпиляцию программ, которые их используют (удаление или добавление строки, добавление ссылочного ограничения и даже добавление триггера). который изменяет данные из такой программы и помещает их в ЖЕ таблицу, как было показано, вызывает проблемы, и системный администратор не хочет перекомпилировать эти программы), поэтому все значения таблиц должны быть скопированы в новые таблицы, эти таблицы могут затем использовать, как мы ожидаем, без особого влияния. Это позволяет в определенной степени отделиться и дает нам некоторую передышку в отношении того, как мы можем управлять схемой.

1 Ответ

1 голос
/ 13 августа 2011

Никогда не рекомендуется использовать формат SELECT * в запросах (кроме ad-hoc dev-run или с представлениями, которые следует рассматривать как API).
Особенно при перемещении данных из одногофайл на другой - что произойдет, если вы измените исходный файл, но не измените (намеренно или случайно) целевой файл?
Я ничего не знаю, когда добавление / удаление триггера из физического файла вызывает уровень-проверьте ошибки (это означает, что программа должна быть перекомпилирована).Если вы измените определение файла и, следовательно, должны будете изменить триггер, вам все равно придется перекомпилировать программу (поскольку меняет подпись).

Если вы, ребята,действительно заинтересованный в возможности обновления базовой схемы, предпочтительным методом является определение представлений (не реплицируемых таблиц) и запрос представлений с помощью SQL.Это полностью (насколько я знаю) устранит необходимость перекомпиляции программ RPG / RPGLE с изменениями PF (хотя изменение представления будет означать, что все должно быть обновлено ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...