Manejador de notificaciones definido por el usuario para trabajos de programador

Database Scheduler proporciona un mecanismo de notificación por correo electrónico para realizar un seguimiento del estado de los trabajos automatizados o en ejecución periódica. Además, Database Scheduler también soporta el procedimiento de manejador de notificaciones de trabajos del programador PL/SQL definido por el usuario.

La adición de un procedimiento de manejador de notificaciones de trabajos del programador permite supervisar los trabajos programados o automatizados que se ejecutan en la instancia de Autonomous Database.

Acerca del Manejador de notificaciones definido por el usuario para trabajos de programador

Database Scheduler soporta el procedimiento de manejador de notificaciones de trabajos que puede utilizar código personalizado para llamar a puntos finales HTTP o REST para mejorar la supervisión de los trabajos del programador en una instancia de Autonomous Database.

El procedimiento de manejador recibe toda la información pertinente relacionada con el trabajo, como el nombre del propietario del trabajo, el nombre de clase, el tipo de evento y el registro de hora en formato JSON. Según la información, el procedimiento del manejador realiza la acción necesaria.

Consulte DBMS_SCHEDULER para obtener más información sobre Oracle Scheduler.

La configuración del manejador de notificaciones definido por el usuario para los trabajos del programador consta de los siguientes pasos:

Creación de un Procedimiento de Manejador de Notificación de Trabajo

Proporciona pasos para crear un manejador de notificaciones de trabajos.

  1. Cree un objeto de credencial.

    Consulte CREATE_CREDENTIAL Procedure para obtener más información.

    Consulte Especificación de Credenciales de Trabajo del Planificador para obtener más información.

  2. Cree un manejador de notificaciones Job:

    Ejemplo para crear un procedimiento de manejador de notificaciones de trabajos para enviar un mensaje a un canal de Slack:

    CREATE OR REPLACE PROCEDURE ADMIN.SEND_NOTIFICATION(data_in CLOB) AS
    BEGIN
      DBMS_CLOUD_NOTIFICATION.SEND_MESSAGE (
        provider          => 'slack',
        credential_name   => 'SLACK_CRED',
        message           => data_in,
        params            => JSON_OBJECT('channel' value 'adw-job-nfy');
    end;
    /

    En este ejemplo, se crea el procedimiento SEND_NOTIFICATION.

    Este procedimiento definido por el usuario envía los datos de entrada proporcionados como un mensaje al canal de Slack especificado.

    Consulte Envío de notificaciones de Slack desde Autonomous Database para obtener más información.

    Consulte SEND_MESSAGE Procedure para obtener más información.

    Ejemplo para crear un procedimiento de manejador de notificaciones de trabajo para insertar el mensaje en una tabla:

    CREATE TABLE ADMIN.JOB_STATUS(jnfy_data CLOB);
    
    CREATE OR REPLACE PROCEDURE ADMIN.INSERT_JOB_STATUS(data_in CLOB) AS
      l_sessuser VARCHAR2(128) := SYS_CONTEXT('userenv','session_user');
    BEGIN
      INSERT INTO ADMIN.JOB_STATUS (jnfy_data) VALUES (data_in || TO_CLOB(' : Sent By Session User : ' || l_sessuser));
      COMMIT;
    END;
    /

    En este ejemplo se crea la tabla JOB_STATUS y el procedimiento INSERT_JOB_STATUS para insertar los valores específicos de la sesión en la tabla.

    Debe estar conectado como usuario ADMIN o tener el privilegio del sistema CREATE ANY PROCEDURE para crear un procedimiento de manejador de notificaciones de trabajos.

    Nota

    Se devuelve ORA-27405 al especificar un nombre de objeto o propietario no válido como procedimiento del manejador de notificaciones de trabajos.

    Los procedimientos DBMS_SCHEDULER existentes ADD_JOB_EMAIL_NOTIFICATION y REMOVE_JOB_EMAIL_NOTIFICATION se han mejorado para soportar el procedimiento del manejador de notificaciones de trabajos.

    Consulte Procedimiento ADD_JOB_EMAIL_NOTIFICATION y Procedimiento REMOVE_JOB_EMAIL_NOTIFICATION para obtener más información.

    Utilice la vista de diccionario DBA_SCHEDULER_NOTIFICATIONS para consultar la lista de notificaciones de un trabajo del programador. Consulte DBA_SCHEDULER_NOTIFICATIONS para obtener más información.

Registro del Procedimiento de Notificación del Manejador de Trabajos

Utilice el procedimiento DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE para definir el valor de atributo JOB_NOTIFICATION_HANDLER para registrar el procedimiento de notificación del manejador de trabajos.

El atributo JOB_NOTIFICATION_HANDLER especifica el procedimiento de notificación del manejador de trabajos que desea utilizar.

Para registrar el procedimiento de notificación del manejador de trabajos, debe:
  • Conéctese como usuario ADMIN o tenga el privilegio MANAGE SCHEDULER.

  • Tenga el privilegio EXECUTE en el procedimiento del manejador o el privilegio del sistema EXECUTE ANY PROCEDURE.

El atributo JOB_NOTIFICATION_HANDLER y el atributo EMAIL_SERVER se excluyen mutuamente. El parámetro ATTRIBUTE del procedimiento SET_SCHEDULER_ATTRIBUTE puede tener el valor JOB_NOTIFICATION_HANDLER o EMAIL_SERVER a la vez. Puede configurar notificaciones por correo electrónico o crear el manejador de notificaciones para los trabajos del programador.

Se emite un error ORA-27488 al intentar definir los atributos globales EMAIL_SERVER y JOB_NOTIFICATION_HANDLER.

Ejecute el procedimiento DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE para registrar el procedimiento de notificación del manejador de trabajos:

BEGIN
  DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE('job_notification_handler','ADMIN.SEND_NOTIFICATION');
END;
/

En este ejemplo, se registra el procedimiento ADMIN.SEND_NOTIFICATION como procedimiento de notificación del manejador de trabajos para la base de datos.

Consulte SET_SCHEDULER_ATTRIBUTE Procedure para obtener más información.

Ejecute este comando para verificar el manejador de notificaciones de trabajos:


SELECT value FROM dba_scheduler_global_attribute WHERE attribute_name='JOB_NOTIFICATION_HANDLER';

VALUE
---------------
"ADMIN"."SEND_NOTIFICATION"

Consulte DBA_SCHEDULER_GLOBAL_ATTRIBUTE para obtener más información.

Debe asignar el privilegio EXECUTE para permitir que otros usuarios utilicen el manejador de notificaciones de trabajos. Por ejemplo:

GRANT EXECUTE ON ADMIN.SEND_NOTIFICATION To DWUSER;

Si no tiene privilegios en el procedimiento de notificación del manejador de trabajos, se devuelve el error ORA-27476 ("\"%s\".\"%s\" does not exist") o ORA-27486 ("insufficient privileges").

Disparar el procedimiento de notificación del manejador de trabajos

Debe llamar al procedimiento DBMS_SCHEDULER.ADD_JOB_EMAIL_NOTIFICATION para disparar el procedimiento del manejador de notificaciones de trabajos definido por el usuario.

El formulario sobrecargado de DBMS_SCHEDULER.ADD_JOB_EMAIL_NOTIFICATION permite disparar el procedimiento del manejador de notificaciones de trabajos y enviar una notificación. Sin embargo, estas notificaciones no se envían en forma de correo electrónico cuando se ha registrado el procedimiento del manejador de notificaciones de trabajo. Por lo tanto, los parámetros SUBJECT y BODY son opcionales. El parámetro RECIPIENT sigue siendo obligatorio. Dado que esta forma de procedimiento sobrecargada no envía notificaciones por correo electrónico, puede proporcionar cualquier valor de cadena para el parámetro RECIPIENT.
Por ejemplo, los siguientes pasos crean un trabajo del programador, agregan una notificación para el trabajo, activan el trabajo, verifican las entradas de notificación, muestran los datos recibidos por el procedimiento del manejador de notificaciones de trabajo y eliminan la notificación para el trabajo.
  1. Cree un trabajo del programador en el esquema DWUSER:
    BEGIN
     DBMS_SCHEDULER.CREATE_JOB(
       job_name   => 'DWUSER.MY_JOB',
       job_type   => 'PLSQL_BLOCK',
       job_action => 'BEGIN null; END;',
       enabled    => FALSE,
       auto_drop  => FALSE);
    END;
    /

    Esto crea un trabajo DWUSER.MY_JOB con los atributos especificados.

    Consulte CREATE_JOB Procedure para obtener más información.

  2. Configure el trabajo para enviar notificaciones en eventos especificados.
    BEGIN
      DBMS_SCHEDULER.ADD_JOB_EMAIL_NOTIFICATION(
        job_name   => 'DWUSER.MY_JOB',
        recipients => 'PLACEHOLDER_STRING',
        subject    => 'Job Notification-%job_owner%.%job_name%-%event_type%',
        body       => '%event_type% occurred at %event_timestamp%. %error_message%',
        events     => 'job_started, job_succeeded, job_completed');
    END;
    /

    Este procedimiento agrega notificaciones para el trabajo DWUSER.MY_JOB. Las notificaciones se envían cuando se emite cualquiera de los eventos de estado de trabajo especificados.

    Consulte ADD_JOB_EMAIL_NOTIFICATION Procedure para obtener más información.

  3. Active el trabajo del programador.
    EXEC DBMS_SCHEDULER.ENABLE('DWUSER.MY_JOB');

    Consulte ENABLE Procedure para obtener más información.

    Al activar el trabajo DWUSER.MY_JOB, la vista USER_SCHEDULER_NOTIFICATIONS se rellena con las entradas de notificación de trabajo. Para verificarlo, puede consultar la vista USER_SCHEDULER_NOTIFICATIONS. Por ejemplo:
    SELECT  job_name, recipient, event, subject, body
    FROM user_scheduler_notifications
    ORDER BY notification_owner, owner, job_name;
    
    JOB_NAME    RECIPIENT            EVENT          SUBJECT         BODY
    -------    ------------------   -------------  --------------- ---------------
    MY_JOB     placeholder_string   JOB_STARTED    Job Notificatio %event_type% oc
                                                   n-%job_owner%.% curred at %even
                                                   job_name%-%even t_timestamp%. %
                                                   t_type%         error_message%
    
    MY_JOB     placeholder_string  JOB_SUCCEEDED    Job Notificatio %event_type% oc
                                                    n-%job_owner%.% curred at %even
                                                    job_name%-%even t_timestamp%. %
                                                    t_type%         error_message%
     	
    MY_JOB    placeholder_string  JOB_COMPLETED    Job Notificatio %event_type% oc
                                                   n-%job_owner%.% curred at %even
                                                   job_name%-%even t_timestamp%. %
                                                   t_type%         error_message%

    Consulte USER_SCHEDULER_NOTIFICATIONS View para obtener más información.

    Cuando se ejecuta el trabajo DWUSER.MY_JOB y se emite cualquiera de los eventos de estado de trabajo especificados, se dispara el procedimiento del manejador de notificaciones de trabajo y recibe la información especificada como entrada. Por ejemplo, el procedimiento del manejador de notificaciones de trabajos ADMIN.SEND_NOTIFICATION recibe lo siguiente:

    {"job_owner":"DWUSER","job_name":"MY_JOB","job_class_name":"DEFAULT_JOB_CLA
    SS","event_type":"JOB_STARTED","event_timestamp":"12-JAN-23 08.13.46.193306
     PM UTC","error_code":0,"error_msg":null,"sender":null,"recipient":"data_lo
    ad_pipeline","subject":"Job Notification-DWUSER.MY_JOB-JOB_STARTED","msg_te
    xt":"JOB_STARTED occurred at 12-JAN-23 08.13.46.193306 PM UTC. ","comments"
    :"User defined job notification handler"}
     
    {"job_owner":"DWUSER","job_name":"MY_JOB","job_class_name":"DEFAULT_JOB_CLA
    SS","event_type":"JOB_SUCCEEDED","event_timestamp":"12-JAN-23 08.13.46.2863
    44 PM UTC","error_code":0,"error_msg":null,"sender":null,"recipient":"data_
    load_pipeline","subject":"Job Notification-DWUSER.MY_JOB-JOB_SUCCEEDED","ms
    g_text":"JOB_SUCCEEDED occurred at 12-JAN-23 08.13.46.286344 PM UTC. ","com
    ments":"User defined job notification handler"}
    
  4. Elimine la notificación de trabajo. Por ejemplo:
    EXEC DBMS_SCHEDULER.REMOVE_JOB_EMAIL_NOTIFICATION('DWUSER.MY_JOB');

    Consulte REMOVE_JOB_EMAIL_NOTIFICATION Procedure para obtener más información.

Anular Registro del Procedimiento de Notificación del Manejador de Trabajos

Utilice DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE para anular el registro del procedimiento de notificación del manejador de trabajos.

Para anular el registro del procedimiento de notificación del manejador de trabajos, debe estar conectado como usuario ADMIN o tener el privilegio MANAGE SCHEDULER.

Ejemplo para anular el registro del procedimiento de notificación del manejador de trabajos:

BEGIN
  DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE ('job_notification_handler','');
END;
/