summaryrefslogtreecommitdiff
path: root/task6_triggers.sql
blob: 3c8a147132d165403ae77bc21fefd9c9083a861b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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