summaryrefslogtreecommitdiff
path: root/task6_triggers.sql
diff options
context:
space:
mode:
authorAndrew <saintruler@gmail.com>2021-12-16 22:07:07 +0400
committerAndrew <saintruler@gmail.com>2021-12-16 22:07:07 +0400
commit8cb863786cd06ea8c44bea35b77002998075d3bb (patch)
treec356ea2d2c4a6f1f073e4c172ec5ac3d5183873d /task6_triggers.sql
parent7b175fa90c363fbed96aa4c55593f9dbe6f03ada (diff)
Добавил второе задание шестой лабы.
Diffstat (limited to 'task6_triggers.sql')
-rw-r--r--task6_triggers.sql128
1 files changed, 128 insertions, 0 deletions
diff --git a/task6_triggers.sql b/task6_triggers.sql
new file mode 100644
index 0000000..3c8a147
--- /dev/null
+++ b/task6_triggers.sql
@@ -0,0 +1,128 @@
+---------------
+-- Задание 1 --
+---------------
+
+-- CREATE TRIGGER OrderDateUpdate ON Orders
+-- AFTER UPDATE
+-- AS BEGIN
+-- DECLARE @order_id INT, @delivery_id INT, @date DATETIME;
+-- SELECT @order_id = inserted.id FROM inserted;
+-- SELECT @delivery_id FROM Shipments WHERE order_id=@order_id;
+-- UPDATE Deliveries SET date=@date WHERE id=@delivery_id;
+-- END
+
+---------------
+-- Задание 2 --
+---------------
+
+CREATE VIEW OrdersView WITH SCHEMABINDING AS
+SELECT Orders.id, Orders.customer_id,
+ Orders.date order_date,
+ D.driver_id, D.vehicle_id, D.route_id,
+ D.date delivery_date
+FROM dbo.Orders
+JOIN dbo.Shipments ON Orders.id = Shipments.order_id
+JOIN dbo.Deliveries D on Shipments.delivery_id = D.id
+JOIN dbo.Cities ON Orders.city_id = Cities.id
+GO
+
+DROP VIEW OrdersView
+GO
+
+-- INSTEAD OF INSERT
+
+CREATE TRIGGER InsertOrdersView ON OrdersView
+INSTEAD OF INSERT
+AS BEGIN
+ DECLARE @route_id INT, @city_src INT, @city_dst INT;
+ SELECT @route_id=inserted.route_id FROM inserted;
+ SELECT @city_src=city1_id, @city_dst=city2_id FROM Routes WHERE id=@route_id;
+ IF @city_src IS NULL OR @city_dst IS NULL BEGIN
+ RAISERROR (N'Не найден указанный путь', 10, 1)
+ ROLLBACK TRAN
+ END
+
+ INSERT INTO Orders (customer_id, city_id, date)
+ SELECT inserted.customer_id, @city_dst, inserted.order_date
+ FROM inserted;
+ DECLARE @order_id INT;
+ SET @order_id = SCOPE_IDENTITY();
+
+ INSERT INTO Deliveries (driver_id, vehicle_id, route_id, date)
+ SELECT inserted.driver_id, inserted.vehicle_id, inserted.route_id, inserted.delivery_date
+ FROM inserted;
+ DECLARE @delivery_id INT;
+ SET @delivery_id = SCOPE_IDENTITY();
+
+ INSERT INTO Shipments (order_id, delivery_id) VALUES (@order_id, @delivery_id);
+END
+GO
+
+DROP TRIGGER InsertOrdersView
+GO
+
+INSERT INTO OrdersView (id, customer_id, order_date, driver_id, vehicle_id, route_id, delivery_date)
+VALUES (1, 123, '2021-09-12', 43, 12, 6, '2021-09-24')
+GO
+
+-- INSTEAD OF UPDATE
+
+CREATE TRIGGER UpdateOrdersView ON OrdersView
+INSTEAD OF UPDATE
+AS BEGIN
+ DECLARE @route_id INT, @city_src INT, @city_dst INT;
+ SELECT @route_id=route_id FROM inserted;
+ SELECT @city_src=city1_id, @city_dst=city2_id FROM Routes WHERE id=@route_id;
+ IF @city_src IS NULL OR @city_dst IS NULL BEGIN
+ RAISERROR (N'Не найден указанный путь', 10, 1)
+ ROLLBACK TRAN
+ END
+
+ UPDATE Orders
+ SET customer_id=inserted.customer_id,
+ city_id=@city_dst,
+ date=inserted.order_date
+ FROM inserted
+ WHERE Orders.id=inserted.id;
+
+ DECLARE @order_id INT, @delivery_id INT;
+ SELECT @order_id=inserted.id FROM inserted;
+ SELECT @delivery_id FROM Shipments WHERE order_id=@order_id;
+
+ UPDATE Deliveries
+ SET driver_id=inserted.driver_id,
+ vehicle_id=inserted.vehicle_id,
+ route_id=inserted.route_id,
+ date=inserted.delivery_date
+ FROM inserted
+ WHERE Deliveries.id = @delivery_id;
+END
+GO
+
+DROP TRIGGER UpdateOrdersView
+GO
+
+-- TODO: Добавить запрос с UPDATE
+
+-- INSTEAD OF DELETE
+
+CREATE TRIGGER DeleteOrdersView ON OrdersView
+INSTEAD OF DELETE
+AS BEGIN
+ DECLARE @order_id INT, @delivery_id INT;
+ SELECT @order_id = deleted.id FROM deleted;
+ SELECT @delivery_id FROM Shipments WHERE order_id=@order_id;
+
+ DELETE FROM Boxes WHERE order_id=@order_id;
+ DELETE FROM Payments WHERE order_id=@order_id;
+ DELETE FROM Deliveries WHERE id=@delivery_id;
+ DELETE FROM Shipments WHERE order_id=@order_id AND delivery_id=@delivery_id;
+ DELETE FROM Orders WHERE id=@order_id;
+END
+GO
+
+DROP TRIGGER DeleteOrdersView
+GO
+
+DELETE FROM OrdersView WHERE delivery_date='2021-09-12'
+GO