Desencadenador PL/SQL ANTES DE INSERTAR basado en los valores de la tabla en cambio.
Tengo este problema.
Quiero evitar agregar nuevos carritos si el cliente ya tiene al menos un carrito de compras no pagado utilizando un disparador antes de la inserción en cada fila (en caso de que se inserten más de un carrito nuevo).
Captura de pantalla del modelo de tablas
Logré resolver este problema bastante fácilmente en T-SQL contando los registros que contienen NULL en la columna paidTime en la tabla modificada.
sql<br>
CREATE TRIGGER one_unpaid_cart_per_client ON Cart<br>
FOR INSERT<br>
AS<br>
BEGIN<br>
SET NOCOUNT ON;<br>
DECLARE newCart_cursor CURSOR FOR SELECT IdClient, IdCart, isPaid FROM inserted;<br>
<br>
DECLARE @IdClient int;<br>
DECLARE @IdCart int;<br>
DECLARE @isPaid datetime;<br>
<br>
OPEN newCart_cursor;<br>
FETCH NEXT FROM newCart_cursor INTO @IdClient, @IdCart, @isPaid;<br>
<br>
WHILE @@FETCH_STATUS = 0<br>
BEGIN<br>
IF @isPaid is null<br>
BEGIN<br>
if 1 < (SELECT COUNT(1) FROM Cart WHERE IdClient = @IdClient AND isPaid is Null)<br>
BEGIN<br>
PRINT 'Ya existe un carrito no pagado para el cliente con id: ' + Cast(@IdClient as Varchar);<br>
DELETE FROM Cart WHERE IdCart = @IdCart;<br>
Raiserror('El nuevo carrito no se ha agregado', 1, 1);<br>
END;<br>
END;<br>
FETCH NEXT FROM newCart_cursor INTO @IdClient, @IdCart, @isPaid;<br>
END;<br>
<br>
CLOSE newCart_cursor;<br>
DEALLOCATE newCart_cursor;<br>
SET NOCOUNT OFF;<br>
<br>
END;<br>
Sin embargo, en PL/SQL, según lo que sé, no se puede consultar la tabla cambiante, por lo que no puedo verificar cuántos carritos impagos hay.
¿Hay algo que pueda hacer para lograr esto utilizando un disparador en PL/SQL?
¡Gracias por cualquier ayuda!
davy.ai
Evitar agregar nuevos carritos si el cliente ya tiene un carrito de compras sin pagar
Para evitar agregar un nuevo carrito si el cliente ya tiene al menos un carrito de compras sin pagar usando un disparador antes de la inserción en cada fila, se puede utilizar el siguiente disparador PL/SQL:
Este disparador evitará que se inserten nuevas filas en la tabla Cart para un cliente en particular si ese cliente ya tiene al menos un carrito sin pagar. Funciona contando el número de filas en la tabla Cart para un cliente dado donde la columna isPaid es NULL. Si el recuento es mayor que cero, se genera un error, evitando que se inserte la nueva fila.
Nota que este disparador utiliza la sintaxis :new para hacer referencia a los valores de la nueva fila que se está insertando.