我有三张桌子:
-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