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:创建作业调度。
创建一个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
我想也就只能这样了,关于自动判断时间,我不知道触发器怎么做到
期待后面的也来指导一下
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的具体格式还不是知道的很多
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
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
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值相同时,才进行同步更新)
表中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
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表的
你说的我也写上面了
不能只判断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
--该触发器是自动更新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服务启动,并设置为自动启动,否则你的作业不会被执行
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
改一下吧
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更新
写在一个触发器是合理的
也带动user_account更新
写在一个触发器是合理的
#1
触发器不行,得用JOB来做,步骤如下:
创建一个JOB;
指定JOB的执行操作为更新操作;
调度这个JOB,定为每分钟执行一次。
注意:需要启动SQLServerAgent
参阅:
sp_add_job :添加由 SQLServerAgent 服务执行的新作业。
sp_add_jobstep :将一个步骤(操作)添加到作业中。
sp_add_jobschedule:创建作业调度。
创建一个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
我想也就只能这样了,关于自动判断时间,我不知道触发器怎么做到
期待后面的也来指导一下
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的具体格式还不是知道的很多
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
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
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值相同时,才进行同步更新)
表中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
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表的
你说的我也写上面了
不能只判断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
--该触发器是自动更新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服务启动,并设置为自动启动,否则你的作业不会被执行
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
改一下吧
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更新
写在一个触发器是合理的
也带动user_account更新
写在一个触发器是合理的