Правильный способ написания триггера MS SQL Server - PullRequest
0 голосов
/ 30 января 2019

Я впервые делаю кодирование на MS SQL, и я хочу убедиться, что я использую правильную конструкцию.

Я пишу триггер вставки, который обновит пару значений для текущей записи на основе значений из предыдущей записи.Поле Cum_cnt имеет кумулятивный счет и может сбрасываться в некоторых точках, следовательно, добавляется, если оператор else для захвата сбрасывается (когда значение ниже, чем предыдущее значение).Я вычисляю количество между записями и обновляю время начала с предыдущей записи.

Основываясь на других моих знаниях базы данных, я установил базу данных MS SQL и написал следующий триггер.Он работает, как и ожидалось, но я не уверен, если это способ записи, и это даст проблемы с производительностью, если мы обновим 7-8 полей.

create table t1 (dt datetime, cum_cnt int, cnt int, st_time datetime, ed_time datetime) 
--drop trigger t1_Trg
CREATE   TRIGGER t1_Trg 
ON  t1
AFTER INSERT 
AS  
DECLARE @v_prev_cnt int
DECLARE @v_curr_cnt int   
DECLARE @v_prev_dt datetime 
DECLARE @v_curr_dt datetime 
DECLARE @v_cnt int
   BEGIN 
    select @v_curr_cnt = i.cum_cnt, @v_curr_dt = i.dt from inserted i

    select @v_prev_cnt = cum_cnt, @v_prev_dt = dt from t1  where dt = (select max(dt) from t1 where dt < @v_curr_dt)
    if (@v_curr_cnt >= @v_prev_cnt)
        set @v_cnt =  @v_curr_cnt - @v_prev_cnt;
    else
        set @v_cnt =  @v_curr_cnt;
    UPDATE t1
    SET st_time = @v_prev_dt,
        ed_time = @v_curr_dt,
        cnt = @v_cnt
    FROM t1
    where dt = @v_curr_dt
END  

--delete from t1

insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:01:00.000' ), 10, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:05:00.000' ), 23, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:10:00.000' ), 27, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:13:00.000' ), 32, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:15:00.000' ), 33, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:17:00.000' ), 33, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:19:00.000' ), 41, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:20:00.000' ), 43, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:23:00.000' ), 04, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:26:00.000' ), 08, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:31:00.000' ), 11, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:34:00.000' ), 15, NULL, NULL, NULL);
insert into t1 (dt , cum_cnt , cnt , st_time , ed_time ) values (Convert(datetime, '2019-01-29 13:35:00.000' ), 18, NULL, NULL, NULL);

Результаты:

select * from t1

dt                 cum_cnt cnt  st_time                 ed_time
2019-01-29 13:01:00.000 10  10  NULL                    2019-01-29 13:01:00.000
2019-01-29 13:05:00.000 23  13  2019-01-29 13:01:00.000 2019-01-29 13:05:00.000
2019-01-29 13:10:00.000 27  4   2019-01-29 13:05:00.000 2019-01-29 13:10:00.000
2019-01-29 13:13:00.000 32  5   2019-01-29 13:10:00.000 2019-01-29 13:13:00.000
2019-01-29 13:15:00.000 33  1   2019-01-29 13:13:00.000 2019-01-29 13:15:00.000
2019-01-29 13:17:00.000 33  0   2019-01-29 13:15:00.000 2019-01-29 13:17:00.000
2019-01-29 13:19:00.000 41  8   2019-01-29 13:17:00.000 2019-01-29 13:19:00.000
2019-01-29 13:20:00.000 43  2   2019-01-29 13:19:00.000 2019-01-29 13:20:00.000
2019-01-29 13:23:00.000 4   4   2019-01-29 13:20:00.000 2019-01-29 13:23:00.000
2019-01-29 13:26:00.000 8   4   2019-01-29 13:23:00.000 2019-01-29 13:26:00.000
2019-01-29 13:31:00.000 11  3   2019-01-29 13:26:00.000 2019-01-29 13:31:00.000
2019-01-29 13:34:00.000 15  4   2019-01-29 13:31:00.000 2019-01-29 13:34:00.000
2019-01-29 13:35:00.000 18  3   2019-01-29 13:34:00.000 2019-01-29 13:35:00.000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...