2015-05-26 3 views
1

Я пытаюсь создать триггер, который отправляет электронное письмо на основе события базы данных, в частности, когда запись INSERTed в определенной таблице, я хочу, чтобы сообщение, в котором указывалось, что факт, чтобы перейти к SysAdmin.Как отправить электронное письмо от IBM iSeries DB2 v7.1

Я могу успешно сделать следующее из окна SQL в ISeries Navigator:

CL:SNDDST TYPE(*LMSG) 
    TOINTNET(('[email protected]')) 
    DSTD('this is the Subject Line') 
    LONGMSG('This is an Email sent from iSeries box via Navigator') 

... и по электронной почте отправляется. Это означает, что необходимый SMTP-материал существует и работает.

Так что все, что я пытаюсь сделать, это инкапсулировать этот код, возможно, с некоторыми изменениями данных (например, «Запись в таблицу XYZ по-любому-sysdate-is»). Навигатор имеет некоторые дразнящие примеры, которые вызывают CL, чтобы сделать некоторые простые вещи ванили, но не имеют понятия, как заставить его работать в триггере. Я знаю, как писать триггеры, которые выполняют «материал базы данных», но не этот материал CL. И это iSeries DB2, поэтому у меня нет доступа к UTL_MAIL.

Я почти ничего не знаю о CL, DDS или других внутренних элементах iSeries ... Я бы предпочел не создавать внешнюю программу Java, а делать это как последнее средство ... но даже тогда, т с трудом находить простые примеры.

благодарит заранее.

ответ

0

Прежде всего, обратите внимание, что SNDDST не лучший выбор для интернет-почты от IBM i. В принципе, SNDDST является реликтом из сетевых дней SNADS, которые IBM взломала для поддержки электронных писем SMTP. Существуют бесплатные альтернативы, или если вы разумно используете исправления для 7.1, то вы должны иметь команду Send SMTP E-mail (SNDSMTPEMM).

Окно запуска SQL Scripts iNav действительно поддерживает команды CL с использованием префикса CL:. Но это не то же самое, что сам механизм запросов понимает CL.

Префикс CL: не будет работать внутри триггера SQL.

Вы можете, однако, use the QCMDEXC stored procedure вызвать команду CL. Но я бы не стал называть это лучшим вариантом.

IBM i поддерживает использование «внешних» хранимых процедур и триггеров. Теоретически вы можете использовать программу CL, которая напрямую вызывает команду SNDSMTPEMM. Но, учитывая, что вы хотите включить данные из таблицы, я бы не рекомендовал этот подход, поскольку вы были бы привязаны к структуре таблицы.

Вместо этого создайте свою собственную программу CL UTLMAILSND, которая вызывает SNDSMTPEMM. Затем определила программу UTLMAILSND как external stored procedure (вы даже можете дать ей более длинное имя SQL UTIL_MAIL_SEND).

Теперь вы можете вызвать свою процедуру UTIL_MAIL_SEND() из триггера SQL.

+0

Спасибо - я думаю, что поеду по маршруту простой внешней программы CL. Это первое (и, надеюсь, только?) Время, которое мне придется сделать, хотя, как только концепция будет доказана, запросы на ту же функциональность в другом месте, вероятно, начнут появляться из дерева. Я надеялся на ответ, который оставил меня вне программирования на экране зеленого экрана (что совершенно чуждо мне), но если это единственный способ сделать это, о хорошо ... –

0

Вам необходимо попробовать команду SNDSMTPEMM. Это похоже на нарезанный хлеб по сравнению с SNDDST TYPE(*LMSG) Он также поддерживает HTML, что очень весело.

0

Да, я использовал SNDSMPTEMM (пропуская html на данный момент ...).

Однако большое примечание: использование этой команды в программе CL не работает при вызове из SQL. Мне пришлось изменить его на программу CLLE.

Таким образом, окончательный ответ таков: a) триггер INSERT в рассматриваемой таблице, который вызывает: b) внешнюю ПРОЦЕДУРУ, созданную в базе данных, которая, в свою очередь, вызывает: c) скомпилированный программный объект CLLE , Работает как шарм.

p.s. Я создаю весь текст письма в триггере INSERT и передаю его, в конце концов, в программу CLLE. Это позволяет мне иметь только одну программу CLLE для отчета о любом INSERT/UPDATE/DELETE в любой точке базы данных.

Смежные вопросы