es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Disparador Oracle antes de la actualización e inserción utilizando :new y :old

Estoy practicando lo que aprendí en PL/SQL. Tengo una tabla “Client” que contiene:

Client (id, nombre, apellido, correo electrónico, ciudad, teléfono, comisión, salario)

La comisión siempre debe ser inferior al salario.

Me pidieron crear un disparador en Oracle antes de insertar y actualizar para asegurarme de que la comisión sea inferior al salario. Así es como lo hice:

Crear Trigger verifySalary 
Before insert, update 
ON Client 
for each row 
begin 
    if :new.salary < :new.comm then
        raise_application_error(-20555, 'la comisión debe ser inferior al salario');
    end if;
end;

No estoy seguro de que esto sea correcto, porque si el usuario no actualiza el salario y la comisión, o solo actualiza una de estas dos columnas, ¿cuál será el valor de :new.salary y :new.commission?

¿Cómo debo proceder?
Gracias de antemano.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Estimado usuario,

    Su implementación del desencadenador es correcta, pero ha planteado una preocupación válida sobre los valores de :new.salary y :new.commission cuando solo uno de ellos se actualiza.

    Para manejar este escenario, puede agregar una verificación en el desencadenador para verificar únicamente la comisión si se está actualizando. Puede modificar su desencadenador de la siguiente manera:

    Create Trigger verifySalary
    Before insert or update
    ON Client
    for each row
    begin 
        if :new.comm is not null and :new.salary is not null and :new.comm >= :new.salary then 
            raise_application_error(-20555, 'La comisión debe ser menor que el salario');
        end if;    
    end;
    

    Al verificar si :new.comm no es nulo y :new.salary no es nulo, asegura que ambas columnas tengan valores antes de compararlos. Además, al verificar :new.comm >= :new.salary, se asegura de que solo se genere un error si las comisiones superan los salarios.

    ¡Espero que esto ayude! Hágamelo saber si tiene alguna pregunta adicional.

    Saludos cordiales,
    [Su nombre]

Comments are closed.