Fundamentals PL/SQL: Chapter 16 Creating Database Triggers

9 comentarios para “Fundamentals PL/SQL: Chapter 16 Creating Database Triggers”

  1. pdjaramillo Dice:

    Ejemplo de trigger

    CREATE OR REPLACE TRIGGER secure_emp
    BEFORE INSERT ON copia_empleados
    BEGIN
    IF(TO_CHAR(SYSDATE,’DY’)IN(‘SAT’,'SUN’)) OR
    (TO_CHAR(SYSDATE,HH24:MI)
    NOT BETWEEN ‘08:00′ AND ‘18:00′)
    THEN RAISE APPLICATION_ERROR (-20500,’Solo se puede insertar empleados en horas de trabajo.’);
    END IF;
    END;
    /

    En este ejemplo el trigger o disparador, se ejecutara cuando se trate de ingresar un empleado dentro de la tabla copia_empleado, en horas no laborables, impidiendo asi que esa acción de insercion se lleve a efecto

  2. Yesy Dice:

    Aqui coloco un ejemplo sobre la creación de trigger donde se restringe la insercción dentro de la tabla empleados en ciertas horas de trabajo de lunes a viernes…

    CREATE OR REPLACE TRIGGER secure_emp
    BEFORE INSERT ON employees
    BEGIN
    IF (TO_CHAR(SYSDATE,’DY’)IN(‘SAT’,'SUN’)) OR
    (TO_CHAR(SYSDATE,’HH24:MI’)
    NOT BETWEEN ‘08:00′ AND ‘18:00′)
    THEN RAISE_APPLICATION_ERROR (-20500,’you may
    insert into EMPLOYEES table only
    during business hours.’);
    END IF;
    END;

    Respuesta:

    Trigger created.

  3. Juan Pablo Angamarca Dice:

    El ejercicio de la página 16-14; Crea un trigger que prohíbe el ingreso de datos en la tabla EMPLEADOS a una hora que no esté entre las 8 de la mañana y las 6 de la tarde. Un intento de hacerlo, presentará la excepción programada en el trigger.


    CREATE TABLE EMPLEADOS AS SELECT * FROM EMPLOYEES;
    CREATE OR REPLACE TRIGGER secure_emp
    BEFORE INSERT ON EMPLEADOS
    BEGIN
    IF (TO_CHAR(SYSDATE, 'DY') IN ('SAT', 'SUN')) OR (TO_CHAR(SYSDATE, 'HH24:MI') NOT BETWEEN '08:00' AND '18:00') THEN
    RAISE_APPLICATION_ERROR(-20500, 'You may insert into EMPLOYEES table only during business hours');
    END IF;
    END;
    /
    INSERT INTO EMPLEADOS (employee_id, last_name, first_name, email, hire_date, job_id, salary, department_id)
    VALUES (300, 'Smith', 'Rob', 'RSMITH', SYSDATE, 'IT_PROG', 4500, 60);

    Salida del programa:


    Table created.
    Trigger created.
    INSERT INTO EMPLEADOS (employee_id, last_name, first_name, email, hire_date, job_id, salary, department_id)
    *
    ERROR at line 1:
    ORA-20500: You may insert into EMPLOYEES table only during business hours
    ORA-06512: at "JANGAMARCA.SECURE_EMP", line 3
    ORA-04088: error during execution of trigger 'JANGAMARCA.SECURE_EMP'

  4. Martin Coronel Dice:

    En este ejemplo expandido:

    CREATE OR REPLACE TRIGGER secure_emp
    BEFORE INSERT ON empleados
    BEGIN
    IF (TO_CHAR(SYSDATE, ‘DY’) IN (‘SAT’, ‘SUN’)) OR
    (TO_CHAR(SYSDATE, ‘HH24:MI’) NOT BETWEEN ‘08:00′ AND ‘18:00′)
    THEN
    IF DELETING THEN
    RAISE_APPLICATION_ERROR (-20502, ‘You may delete only during business hours.’) ;
    ELSIF INSERTING THEN
    RAISE_APPLICATION_ERROR (-20500, ‘You may insert only during business hours.’) ;

    ELSIF UPDATING (‘SALARY’)THEN
    RAISE_APPLICATION_ERROR (-20503, ‘You may update SALARY only during business hours.’) ;
    ELSE
    RAISE_APPLICATION_ERROR (-20504, ‘You may update EMPLEADOS table only during normal hours.’) ;
    END IF;
    END IF;
    END;

    /
    show errors
    –Esto tambien lo puedo probar

    END IF;
    END;
    /

    Se demuestra que se pueden combinar diferentes eventos disparadores para el trigger, en este caso sobre la tabla EMPLEADOS que es copia de employees.

    Aquí se chequea que las operaciones de insercion, borrado o actualización del campo SALARY sólo durante horas laborables (8:00-18:00)

  5. Luis E Castillo Dice:

    El siguiente codigo es útil para enviar un mail cuando un usuario se loguea a una determinada base de datos.

    CREATE OR REPLACE TRIGGER LOGON_MAIL
    AFTER LOGON ON database
    DECLARE
    v_connection UTL_SMTP.CONNECTION;
    v_reply UTL_SMTP.REPLY;
    BEGIN
    v_connection := UTL_SMTP.OPEN_CONNECTION(‘gdr3.utpl.edu.ec’,25);
    v_reply := UTL_SMTP.HELO(v_connection,’mail.dominio.com’);
    v_reply := UTL_SMTP.MAIL(v_connection,’remitente@dominio.com’);
    v_reply := UTL_SMTP.RCPT(v_connection,’destinatario@otrodominio.com’);
    v_reply := UTL_SMTP.DATA(v_connection,’USUARIO ‘||USER || ‘FECHA INGRESO ‘||SYSDATE);
    v_reply := UTL_SMTP.QUIT(v_connection);

    END;
    /

    Esta implementado como trigger el cual se desencadena en el momento en que cualquier usuario ingresa a la base de datos y se envia un mail a una persona

  6. Luis Feijoo Dice:

    Aqui un ejemplo de la creacion de un trigger, cada vez que un nuevo empleado se agrega a la tabla de empleados o cuando el sueldo de un empleado existente o el ID de trabajo es cambiada, el sueldo del empleado entra dentro del rango de salario establecido para el trabajo del empleado.

    Cuando un registro del empleado es actualizado, el trigger CHECK_SALARY se dispara para cada fila que se actualiza.

    CREATE OR REPLACE TRIGGER check_salary
    BEFORE INSERT OR UPDATE OF salary, job_id
    ON employees
    FOR EACH ROW
    WHEN (NEW.job_id ‘AD_PRES’)
    DECLARE
    v_minsalary employees.salary%TYPE;
    v_mAXsalary employees.salary%TYPE;
    BEGIN
    SELECT MIN(salary), MAX(salary)
    INTO v_minsalary, v_maxsalary
    FROM employees
    WHERE job_id = :NEW.job_id;
    IF :NEW.salary v_maxsalary THEN
    RAISE_APPLICATION_ERROR(-20505, ‘Out of range’);
    END IF;
    END;

    Trigger created.

  7. Jose Antonio Dice:

    Trasteando con el paquete UTL_SMTP resulta que al ejecutar utlsmtp.sql he perdido el body del package.
    ¿ cómo puedo recuperarlo e incorporarlo a la base de datos para poder utilizarlo ?

    Gracias

    Saludos

  8. Ariel Dice:

    Cómo hacer un desencadenador para registrar las modificaciones que un usuario realice en una tabla?. gracias


Escribe un comentario