#sql #triggers #db2 #generator
#sql #триггеры #db2 #генератор
Вопрос:
Мне часто приходится создавать триггер, который копирует все содержимое строк при вставке / обновлении в другую таблицу. Поскольку некоторые таблицы содержат 200 столбцов, часто требуется долгое написание
CREATE TRIGGER scheme.trigger AFTER UPDATE ON scheme.table
REFERENCING OLD as o_row NEW as n_row
FOR EACH ROW
BEGIN
INSERT INTO archive (...) VALUES(...);
END;
Это большой набор текста. Существует ли простой генератор для создания триггеров такого типа, вставок, обновлений?
Комментарии:
1. Я годами не работал с DB2, но разве нет таблицы словаря данных, на которую вы могли бы ссылаться, чтобы получить имена столбцов? Написать сохраненную процедуру для вывода вышеуказанного, вставляя в этот вывод список столбцов? Я делал это в Oracle и SQL Server, поэтому я предполагаю, что именно так вы сделали бы это в DB2.
2. Я планирую создать для этого вспомогательный инструмент, но в настоящее время у меня немного не хватает времени, и мне было интересно, нет ли бесплатного инструмента для этого.
3. начните с «выбрать * из системных таблиц» и переходите оттуда. Я подозреваю, что гораздо проще создать свой собственный, чем искать точный инструмент. это не такая уж сложная задача.
Ответ №1:
Если процесс имеет набор входных параметров и процесс с этими параметрами тот же, вы можете вызвать хранимую процедуру из триггера, передав параметры. Таким образом, вам не нужно переписывать / воссоздавать все эти предложения DML.
Комментарии:
1. Звучит неплохо, но количество параметров отличается от таблицы к таблице. Поддерживаются ли хранимые процедуры iSeries DB2 переменной длины параметров (возможно, вы знаете)?
2. Принято, поскольку нет инструмента, и это самый гибкий способ справиться с этим вручную.
Ответ №2:
Я не знаю инструмента, который генерирует инструкции CREATE TRIGGER для вас, но я много раз генерировал этот DDL из запроса, и единственное представление, которое мне когда-либо требовалось для ссылок, было SYSCAT.COLUMNS
Следующие факторы упростят запрос генератора триггеров DDL, который вы будете писать: — Имена столбцов между исходной таблицей и архивной таблицей идентичны. — Ни один из столбцов в целевой таблице не определен как СГЕНЕРИРОВАННЫЙ ВСЕГДА, в противном случае вам нужно будет исключить их из вашего оператора INSERT.