Триггер в SQL, который обновляет тот же атрибут, но в двух разных строках - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь решить следующую проблему:

У меня есть две таблицы. Первая называется «Платежи» и выглядит следующим образом:

id_payment |  date      | id_month |  total 
-----------+------------+----------+--------
1          | 2019-01-01 |    1     |     0 
2          | 2019-01-02 |    2     |   160

Вторая таблицаназывается «Месяц» и выглядит следующим образом:

id_month | month_name    | initial_date | final_date | total_payments 
---------+---------------+--------------+------------+---------------
    1    | January/2019  | 2019-01-01   | 2019-31-01 |      0
    2    | February/2019 | 2019-01-02   | 2019-28-02 |    160

Теперь проблема в том, что если я обновлю дату одного из платежей, триггер должен сделать таблицы похожими на:

id_payment | date       | id_month |  total 
-----------+------------+----------+--------
    1      | 2019-01-01 |    1     |    0 
    2      | 2019-01-01 |    1     |  160


id_month | month_name    | initial_date | final_date | total_payments 
---------+---------------+--------------+------------+---------------
   1     | January/2019  | 2019-01-01   | 2019-31-01 |   160
   2     | February/2019 | 2019-01-02   | 2019-28-02 |     0

Но окончательный результат таков:

id_payment |  date      | id_month |  total 
-----------+------------+----------+-------
    1      | 2019-01-01 |   1      |    0 
    2      | 2019-01-01 |   1      |  160


id_month | month_name    | initial_date | final_date | total_payments 
---------+---------------+--------------+------------+---------------
    1    | January/2019  | 2019-01-01   | 2019-31-01 |    160
    2    | February/2019 | 2019-01-02   | 2019-28-02 |    160

Мой триггер:

CREATE TRIGGER trg_UpdatingTotalInPaymentsInTheMonth 
ON Payments
AFTER INSERT, UPDATE, DELETE  
AS  
BEGIN  
    DECLARE @id_month AS INT

    SELECT @id_month = id_month FROM inserted
    SET @id_month = @id_month

    DECLARE @total_payments AS MONEY

    SELECT @total_paymdents = SUM(p.total) 
    FROM Payments AS p 
    WHERE o.id_month = @id_month  

    SET @total_payments = @total_payments

    UPDATE month  
    SET total_payments = @total_payments
    FROM month AS m  
    INNER JOIN inserted as i ON i.id_month = m.id_month  
END

1 Ответ

0 голосов
/ 07 ноября 2019

В вашем запросе есть много вещей, которые не соответствуют вашим таблицам, например, id_mes и псевдонимы p в вашем запросе платежей, но реальная проблема заключается в том, что ваш триггер предполагает одну строку.

Это не тот случай, триггер будет вызываться один раз для всего обновления, и в него будет вставлено несколько строк.

Это обновление будет работать в зависимости от базы данных. Вы должны быть в состоянии адаптировать его, если ваша база данных не поддерживает CTE

;with totals as (
    select id_month, sum(total) as total_payments 
    from payments
    where id_month in (select id_month FROM inserted)
    group by id_month
)
update month set total_payments=t.total_payments
from month 
join totals on totals.id_month=month.id_month
...