Manejador de notificaciones definido por el usuario para trabajos de programador

El planificador de base de datos proporciona un mecanismo de notificación por correo electrónico para realizar un seguimiento del estado de los trabajos automáticos o en ejecución periódicamente. Además, el planificador de base de datos también soporta el procedimiento de manejador de notificaciones de trabajos del planificador 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 Autonomous Database.

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

El programador de base de datos 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 sobre 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. En función de la información, el procedimiento de 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 Notificaciones de Trabajo

Proporciona los pasos para crear un manejador de notificaciones de trabajo.

  1. Cree un objeto de credencial.

    Consulte Procedimiento CREATE_CREDENTIAL 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 de trabajo:

    Ejemplo para crear un procedimiento de manejador de notificaciones de trabajo 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 mensaje al canal de Slack especificado.

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

    Consulte el procedimiento SEND_MESSAGE 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 trabajo.

    Nota

    Se devuelve ORA-27405 cuando especifica un nombre de objeto o propietario no válido como procedimiento de manejador de notificaciones de trabajo.

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

    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.

Registrar el procedimiento de notificación del gestor de trabajos

Utilice el procedimiento DBMS_SCHEDULER.SET_SCHEDULER_ATTRIBUTE para definir el valor del 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 gestor de puestos, debe:
  • Conéctese como usuario ADMIN o tenga el privilegio MANAGE SCHEDULER.

  • Tenga el privilegio EXECUTE en el procedimiento de 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 produce 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 el procedimiento SET_SCHEDULER_ATTRIBUTE 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 gestor de trabajos

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

El formulario sobrecargado de DBMS_SCHEDULER.ADD_JOB_EMAIL_NOTIFICATION permite disparar el procedimiento de manejador de notificaciones de trabajo 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 de 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 sobrecargada de procedimiento no envía notificaciones por correo electrónico, puede proporcionar cualquier valor de cadena para el parámetro RECIPIENT.
Por ejemplo, en los siguientes pasos se crea un trabajo de programador, se agrega una notificación para el trabajo, se activa el trabajo, se verifican las entradas de notificación, se muestran los datos recibidos por el procedimiento de manejador de notificaciones de trabajo y se elimina 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 el procedimiento CREATE_JOB 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 cada vez que se emite alguno de los eventos de estado de trabajo especificados.

    Consulte el procedimiento ADD_JOB_EMAIL_NOTIFICATION para obtener más información.

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

    Consulte el procedimiento ENABLE 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 de manejador de notificaciones de trabajo y recibe la información especificada como entrada. Por ejemplo, el procedimiento de 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 el procedimiento REMOVE_JOB_EMAIL_NOTIFICATION para obtener más información.

Procedimiento de notificación de anulación de registro del gestor 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 gestor de puestos:

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