首页 > 解决方案 > 是否可以在给定触发器的情况下在不同时间两次更新一行?

问题描述

我有三张桌子:

-D_REGLAS_COMERCIALES--> 在这张表中,我根据使用机会的数量确定了产品。此表中的字段是:

Num_Trans、Num_Int、Id_Paquete、id_Cliente、Paquete_Servicios、Chances_Monedas、 Estatus

-T_OPERACIONES_PAQUETES--> 此表存储用户购买的产品。这些产品由 Id_Paquete 和 Chances_Monedas (Int) 区分,但共享一个名称 (Paquete_Servicios='Btop')。此表中的字段是:

Paquete, Nombre_Paquete, Id_Paquete, Paquete_Servicios, Chances_Monedas

-betop_reg-->触发器在此表上,其中“Paquete_Servicios”(服务)的使用被注册。此表中的字段是:

Id, Id_usuario, fecha_betop_inicio, fecha_betop_fin

我创建了一个触发器,该触发器折扣到 Chances_Monedas>0 中的第一行并且不为空,但我还想将 Estatus ('Activo') 字段更新为'Inactivo',但我希望最后一次更改仅持续 24 小时,然后返回到“活动”。

因为开始日期很重要(fecha_betop_inicio),所以创建一个每隔一定时间运行的进程对我来说是无效的。我正在考虑创建一个

      date_of_rechange=DATEADD (DAY,1,fecha_betop_inicio) 

然后当 CURRENT_TIMESTAMP = date_of_rechange 然后更新 Estatus='Inactivo' 但第一个更改是使用触发器执行的,第二个更改超出了触发日期。它更像是当前时间来到 date_of_rechange,这怎么可能?

 CREATE TRIGGER TR_D_BETOP
 ON betop_reg
 FOR INSERT
 AS 
 BEGIN
   declare @minimo int=1;
   declare @maximo int= 
                 (SELECT max(Posicion) AS MAXIMO 
                    FROM
                    (SELECT TABLA_A.*,TABLA_B.Chances_Monedas, ROW_NUMBER ()OVER(ORDER BY Id) as 
                     Posicion
                     FROM
                     (select Id, Paquete, Nombre_Paquete,Id_Paquete,Paquete_Servicios   
                             from 
                             D_REGLAS_COMERCIALES
                             WHERE Paquete_Servicios='Btop'
                             and (Paquete='Gratis'
                                  or Paquete='Btop'
                                  or Paquete='Elite')
                                 )TABLA_A
                     FULL OUTER JOIN
                     (select B.* from T_OPERACIONES_PAQUETES B, inserted A
                      WHERE Paquete_Servicios='Btop'
                      and B.id_Cliente=A.Id_usuario
                     )TABLA_B
                     ON TABLA_A.Id_Paquete=TABLA_B.Id_Paquete
                     )Q)

     WHILE @minimo <= @maximo
     BEGIN
     DECLARE @Chance_Actual INT=
                      (SELECT Chances_Monedas 
                       FROM 
                       (SELECT TABLA_A.*,TABLA_B.Chances_Monedas,TABLA_B.Num_Trans,TABLA_B.Num_Int, 
                        ROW_NUMBER ()OVER(ORDER BY Id) as Posicion 
                               FROM (select Id, Paquete, Nombre_Paquete,Id_Paquete,Paquete_Servicios 
                                     from 
                                     D_REGLAS_COMERCIALES
                                     WHERE Paquete_Servicios='Btop'
                                     and 
                                     (Paquete='Gratis' 
                                      or Paquete='Btop'
                                      or Paquete='Elite')
                                     )TABLA_A
                               FULL OUTER JOIN
                               ( select B.* 
                               from T_OPERACIONES_PAQUETES B, inserted A
                               WHERE Paquete_Servicios='Btop'
                               and B.id_Cliente=A.Id_usuario
                               )TABLA_B
                         ON TABLA_A.Id_Paquete=TABLA_B.Id_Paquete
                         )TABLA_FIN
                        WHERE Posicion=@minimo 
                        )

     UPDATE T_OPERACIONES_PAQUETES  
     SET Chances_Monedas =case when( A.Chances_Monedas is not null and A.Chances_Monedas>0) then 
                                    A.Chances_Monedas-1 else A.Chances_Monedas
                                    END
     from  T_OPERACIONES_PAQUETES A,
          (SELECT * 
           FROM 
          (SELECT TABLA_A.*,TABLA_B.Chances_Monedas,TABLA_B.Num_Trans,TABLA_B.Num_Int, ROW_NUMBER 
          ()OVER(ORDER BY Id) as Posicion 
                FROM (select Id, Paquete, Nombre_Paquete,Id_Paquete,Paquete_Servicios 
                      from D_REGLAS_COMERCIALES
                      WHERE Paquete_Servicios='Btop'
                      and 
                      (Paquete='Gratis' 
                      or Paquete='Btop'
                      or Paquete='Elite')
                      )TABLA_A
          FULL OUTER JOIN
                      (select B.* 
                      from T_OPERACIONES_PAQUETES B, inserted A
                       WHERE Paquete_Servicios='Btop'
                      and B.id_Cliente=A.Id_usuario
                      )TABLA_B
         ON TABLA_A.Id_Paquete=TABLA_B.Id_Paquete
         )TABLA_FIN
         WHERE Posicion=@minimo 
         ) B 
         WHERE A.Num_Trans=B.Num_Trans and A.Num_Int=B.Num_Int AND A.Paquete_Servicios='Btop'
   
         IF ( @Chance_Actual )>0
         BREAK;
    
         SET @minimo = @minimo + 1;
    
END;

END

标签: sqltriggersupdatescurrent-time

解决方案


推荐阅读