8. Hacer que no se pueda insertar un pedido si no hay suficiente stock.
PRINT 'Empieza el ejercicio 8'
USE Gestion10
IF OBJECT_ID('ControlStock','P') IS NOT NULL DROP PROC ControlStock
GO
CREATE TRIGGER ControlStock
ON pedidos INSTEAD OF INSERT -- Tenemos que comprobar el stock antes de que se realice la inserción
AS
BEGIN
INSERT INTO Pedidos (numpedido,fechapedido,rep,clie,fab,producto,cant,importe)
SELECT numpedido,fechapedido,rep,clie,fab,producto,cant,importe
FROM Productos INNER JOIN Inserted ON idfab=fab AND idproducto=producto
WHERE existencias-cant >= 0
-- Si existencias-cant < 0 es que no hay suficiente stock, por lo que no se insertará el pedido.
END;
GO
SELECT 'Antes',* FROM productos WHERE idfab='bic' AND idproducto=41003; -- Para comprobar las existencias del producto
INSERT INTO Pedidos (numpedido,fechapedido,rep,fab,producto,clie,cant,importe)
VALUES (010101123,GETDATE(),108,'bic',41003,2103,10,1000);
-- Intentamos insertar un pedido de 10 unidades del producto en cuestion (no hay suficiente stock).
SELECT 'Después INSERT',* FROM productos WHERE idfab='bic' AND idproducto=41003;
-- Comprobamos que el campo existencia no se ha reducido
SELECT 'Después INSERT',* FROM pedidos WHERE numpedido=010101123;
-- Comprobamos que el pedido no se ha introducido
INSERT INTO Pedidos (numpedido,fechapedido,rep,fab,producto,clie,cant,importe)
VALUES (010101123,GETDATE(),108,'bic',41003,2103,2,1000);
-- Intentamos insertar un pedido de 2 unidades del producto en cuestion (hay suficiente stock).
SELECT 'Después INSERT',* FROM productos WHERE idfab='bic' AND idproducto=41003;
-- Comprobamos que el campo existencia se ha reducidoen 2 unidades (por el otro trigger)
SELECT 'Después INSERT',* FROM pedidos WHERE numpedido=010101123;
-- Comprobamos que el pedido ahora sí se ha introducido
9. Crea un procedimiento que impida eliminar varias oficinas en una sóla operación DELETE.
PRINT 'Empieza el ejercicio 9'
USE Gestion10
IF OBJECT_ID('Borrarvarias','P') IS NOT NULL DROP PROC Borrarvarias
GO
CREATE TRIGGER Borrarvarias
ON Oficinas INSTEAD OF DELETE
AS
BEGIN
IF (SELECT COUNT(*) FROM Deleted) = 1
DELETE Oficinas WHERE oficina IN (SELECT oficina FROM Deleted)
ELSE
PRINT 'ERROR, no se pueden eliminar varias oficinas a la vez'
END;
GO
DELETE Oficinas WHERE oficina IN (31,32) -- intentamos eliminar 2 oficinas
SELECT 'Después DELETE',* FROM Oficinas;
-- Comprobamos que las oficinas siguen en la tabla
DELETE Oficinas WHERE oficina = 31 -- intentamos eliminar 1 oficina
SELECT 'Después DELETE',* FROM Oficinas;
-- Comprobamos que la oficina ya no está
Síguenos en: Facebook Sobre aulaClic Política de Cookies
© aulaClic. Todos los derechos reservados. Prohibida la reproducción por cualquier medio.