日期:2014-05-18  浏览次数:20414 次

关于SQL Server2000 触发器的问题
有个TEST表,每10分钟写进1次数据,想最多存储30天的数据,也就是4320条数据,  
存满后,当新数据写进去,最早时间存储的旧数据将被删除。表内始终保持30天的数据。请问利用触发器怎样做?麻烦语句写详细点,谢谢。(表列有:id   tmdate   name)

------解决方案--------------------
用作业比较合适,作业执行语句

delete test where tmdate <dateadd(day,-30,getdate())

每天执行一次

触发器也可以,大概代码:
create trigger tr_test_insert
on test
for inserted
as
set nocount on

delete test where tmdate <dateadd(day,-30,getdate())

go

------解决方案--------------------
create trigger T on test
for insert
as
Begin
Declare @Row int
select @Row =count(*)
from test
if @Row = 4320
delete Test
where ID in(select top 10 ID from Test)
End
------解决方案--------------------
create trigger T on test
for insert
as
Begin
Declare @Row int
select @Row =count(*)
from test
if @Row = 4320
delete Test
where //取最早一条记录
End

只删掉对大一条即可

------解决方案--------------------
--改进一下,兼容多条.
create trigger T on test
for insert
as
Begin
Declare @Row int
declare @insertrow int
declare @sql varchar(1000)
set @sql = ' '
select @Row =count(*) from test
select @insertrow = count(*) from inserted
if @Row = 4320
begin
set @sql = 'delete from test where id in (select top '+rtrim(@insertrow)+ ' id from test order by tmdate desc) '
exec(@sql)
end
End
------解决方案--------------------
楼上的inserted--多了ed去掉

create trigger tr_test_insert
on test
for insert
as
delete a from test as a
where (select count(*) from test where tmdate <a.tmdate) <4320--保留4320

------解决方案--------------------
删除30天前的数据由作业调度来完成比较好(设置每天的执行时间)
用以下代码调度
delect test
where convert(varchar(10),tmdate,120) <convert(varchar(10),getdate()-30,120) <()