求一触发器,自动判断条件后,自动更新两个表的相关字段!

时间:2022-11-25 21:18:27
select * from user_account

account pay_stat
---------------------------------------- ---------
111      0
222      0

select * from user_pay

account pay_stat  start_date   end_date
---------------------------------------- ----------
111      1        2004-11-10   2004-12-10
222      1        2004-12-10   2005-1-10    
首先系统自动判断时间,如果当前系统时间大于user_pay表中end_date,将user_pay表中相关记录的pay_stat值置0,并同步更新 user_account表中的pay_stat 值,如何作到这点???

14 个解决方案

#1


触发器不行,得用JOB来做,步骤如下:

创建一个JOB;
指定JOB的执行操作为更新操作;
调度这个JOB,定为每分钟执行一次。

注意:需要启动SQLServerAgent

参阅:
sp_add_job        :添加由 SQLServerAgent 服务执行的新作业。
sp_add_jobstep    :将一个步骤(操作)添加到作业中。
sp_add_jobschedule:创建作业调度。

#2


create trigger tr_user_pay
on user_pay
for update,insert
as
if (select start_date from user_pay) < getdate()
begin
     update user_pay
     set pay_stat = 0
     where account in (select account from inserted)

     update user_account
     set pay_stat = 0
     where account in (select inserted.account from user_pay,inserted 
                        where  inserted.account = user_pay.account)
end
我想也就只能这样了,关于自动判断时间,我不知道触发器怎么做到
期待后面的也来指导一下

#3


libin_ftsafe(子陌红尘) 能举个例子就好了

JOB的具体格式还不是知道的很多

#4


作业我也写好了,不过好像不行,请dx检查一下
exec P_test
-------------------------------------------------------------------
CREATE proc P_test
as 
begin
  if exists (select * from user_pay where getdate() between start_date and end_date)
else
   UPDATE user_pay SET pay_stat = 1  where getdate() >end_date
end
GO

#5


轮寻表的过程可以通过job定时来实现,除了sql语句外,可通过企业管理器-〉管理-〉作业-〉新建作业-〉步骤(将2个update写入下面的窗口即可),然后定制好时间执行job即可;当然更新第2个表也可以建立trigger来实现,不难

#6


楼上的理解错了。我估计楼主是想在应用系统更新user_pay表时让触发器做这些处理。实现这个触发器没什么困难的,但是现在不流行这样做了,这样的逻辑处理操作一般都放到应用层做了。一是因为触发器只能做到比较简单的逻辑处理,而且有很多限制,比如表间关联什么的;二是不用触发器可以减轻数据库的压力。

#7


update user_pay set pay_stat=0 where end_date<getdate()
update user_account set pay_stat=b.pay_stat from user_account a,user_pay b where a.account=b.account

#8


系统判断时间已通过作业解决,小弟才疏学浅,关键是trigger如何写(user_pay和user_account
表中account值相同时,才进行同步更新)

#9


create trigger tri_update on user_pay
for insert
as
declare @date datetime
set @date=(select getdate())
update user_pay set pay_stat='0' where end_date<@date
update user_account   set pay_stat='0' from user_account a  join user_pay b on a.account=b.account

#10


楼主
你说的我也写上面了
     不能只判断user_pay和user_account
也要看inserted表的

#11


你这个存储过程只有在调用的时候才执行,你的意思是不是你有一个操作平台,每次运行你的某程序时自动根据系统日期来更新pay_stat的值,如果是的话可以用下面的触发器:
--该触发器是自动更新user_pay表的pay_stat字段的值
create trigger tri_update on user_pay
for update
as
declare @sysdate datetime
set @sysdate=getdate()
select * from user_pay where @sysdate>end_date
if @@rowcount>0
update user_pay set pay_stat=0 where @sysdate>end_date
else
return
go


--下面的触发器是更新表user_account中的值
create trigger tri_user_account on user_pay
for update
as
if update(pay_stat) 
update user_account set pay_stat=0 from user_account a,deleted d where d.account=a.account
go

#12


首先建立存储过程:
create proc P_test
as
begin
set nocount on
begin tran T1
update a set a.pay_stat=0 from user_account as a,user_pay as b where a.account=b.account and b.pay_stat=1 and  b.end_date<convert(varchar(10),getdate(),120)
update user_pay set pay_stat=0  where pay_stat=1 and end_date<convert(varchar(10),getdate(),120)
if @@error=0
commit tran T1
else
rollback tran T1
set nocount off
end
-----------------
接着添加作业来定时执行该存储过程:
企业管理器
--管理
--SQL Server代理
--右键作业
--新建作业
--"常规"项中输入作业名称
--"步骤"项
--新建
--"步骤名"中输入步骤名
--"类型"中选择"Transact-SQL 脚本(TSQL)"--->这里换成: exec P_test
--"数据库"选择执行命令的数据库
--"命令"中输入要执行的语句: exec P_test
--确定
--"调度"项
--新建调度
--"名称"中输入调度名称
--"调度类型"中选择你的作业执行安排
--如果选择"反复出现"
--点"更改"来设置你的时间安排


然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行

#13


create trigger tri_update on user_pay
for insert,update
as
declare @date datetime
set @date=(select getdate())
update user_pay set pay_stat='0' where end_date<@date
update user_account   set pay_stat='0' from user_account a  join inserted b on a.account=b.account

改一下吧

#14


应该说user_pay更新后
也带动user_account更新
写在一个触发器是合理的

#1


触发器不行,得用JOB来做,步骤如下:

创建一个JOB;
指定JOB的执行操作为更新操作;
调度这个JOB,定为每分钟执行一次。

注意:需要启动SQLServerAgent

参阅:
sp_add_job        :添加由 SQLServerAgent 服务执行的新作业。
sp_add_jobstep    :将一个步骤(操作)添加到作业中。
sp_add_jobschedule:创建作业调度。

#2


create trigger tr_user_pay
on user_pay
for update,insert
as
if (select start_date from user_pay) < getdate()
begin
     update user_pay
     set pay_stat = 0
     where account in (select account from inserted)

     update user_account
     set pay_stat = 0
     where account in (select inserted.account from user_pay,inserted 
                        where  inserted.account = user_pay.account)
end
我想也就只能这样了,关于自动判断时间,我不知道触发器怎么做到
期待后面的也来指导一下

#3


libin_ftsafe(子陌红尘) 能举个例子就好了

JOB的具体格式还不是知道的很多

#4


作业我也写好了,不过好像不行,请dx检查一下
exec P_test
-------------------------------------------------------------------
CREATE proc P_test
as 
begin
  if exists (select * from user_pay where getdate() between start_date and end_date)
else
   UPDATE user_pay SET pay_stat = 1  where getdate() >end_date
end
GO

#5


轮寻表的过程可以通过job定时来实现,除了sql语句外,可通过企业管理器-〉管理-〉作业-〉新建作业-〉步骤(将2个update写入下面的窗口即可),然后定制好时间执行job即可;当然更新第2个表也可以建立trigger来实现,不难

#6


楼上的理解错了。我估计楼主是想在应用系统更新user_pay表时让触发器做这些处理。实现这个触发器没什么困难的,但是现在不流行这样做了,这样的逻辑处理操作一般都放到应用层做了。一是因为触发器只能做到比较简单的逻辑处理,而且有很多限制,比如表间关联什么的;二是不用触发器可以减轻数据库的压力。

#7


update user_pay set pay_stat=0 where end_date<getdate()
update user_account set pay_stat=b.pay_stat from user_account a,user_pay b where a.account=b.account

#8


系统判断时间已通过作业解决,小弟才疏学浅,关键是trigger如何写(user_pay和user_account
表中account值相同时,才进行同步更新)

#9


create trigger tri_update on user_pay
for insert
as
declare @date datetime
set @date=(select getdate())
update user_pay set pay_stat='0' where end_date<@date
update user_account   set pay_stat='0' from user_account a  join user_pay b on a.account=b.account

#10


楼主
你说的我也写上面了
     不能只判断user_pay和user_account
也要看inserted表的

#11


你这个存储过程只有在调用的时候才执行,你的意思是不是你有一个操作平台,每次运行你的某程序时自动根据系统日期来更新pay_stat的值,如果是的话可以用下面的触发器:
--该触发器是自动更新user_pay表的pay_stat字段的值
create trigger tri_update on user_pay
for update
as
declare @sysdate datetime
set @sysdate=getdate()
select * from user_pay where @sysdate>end_date
if @@rowcount>0
update user_pay set pay_stat=0 where @sysdate>end_date
else
return
go


--下面的触发器是更新表user_account中的值
create trigger tri_user_account on user_pay
for update
as
if update(pay_stat) 
update user_account set pay_stat=0 from user_account a,deleted d where d.account=a.account
go

#12


首先建立存储过程:
create proc P_test
as
begin
set nocount on
begin tran T1
update a set a.pay_stat=0 from user_account as a,user_pay as b where a.account=b.account and b.pay_stat=1 and  b.end_date<convert(varchar(10),getdate(),120)
update user_pay set pay_stat=0  where pay_stat=1 and end_date<convert(varchar(10),getdate(),120)
if @@error=0
commit tran T1
else
rollback tran T1
set nocount off
end
-----------------
接着添加作业来定时执行该存储过程:
企业管理器
--管理
--SQL Server代理
--右键作业
--新建作业
--"常规"项中输入作业名称
--"步骤"项
--新建
--"步骤名"中输入步骤名
--"类型"中选择"Transact-SQL 脚本(TSQL)"--->这里换成: exec P_test
--"数据库"选择执行命令的数据库
--"命令"中输入要执行的语句: exec P_test
--确定
--"调度"项
--新建调度
--"名称"中输入调度名称
--"调度类型"中选择你的作业执行安排
--如果选择"反复出现"
--点"更改"来设置你的时间安排


然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行

#13


create trigger tri_update on user_pay
for insert,update
as
declare @date datetime
set @date=(select getdate())
update user_pay set pay_stat='0' where end_date<@date
update user_account   set pay_stat='0' from user_account a  join inserted b on a.account=b.account

改一下吧

#14


应该说user_pay更新后
也带动user_account更新
写在一个触发器是合理的