SQL Server 2008 r2创建触发器

时间:2012-09-29 14:48:12

标签: sql-server triggers sql-server-2008-r2

我是触发器的新手,我遇到了一些困难我试图创建一个触发器,当有人登录我们的WMS时,它会记录用户登录WMS的时间以及他们闲置的时间。我最初创建了一个存储过程并且它工作得很好但是当我试图将它变成一个触发器时它不会做任何事情或者返回错误。

我已经尝试将整个代码放入触发器中,只是将触发器指向存储过程。

这是我当前的代码,即使已满足基本条件,也没有任何反应。

Use WMS;
Go

Create Trigger ExpiredUsersRmv
On LogFile
For Insert
As

--Total Users before stored procedure runs
Declare @TtlUsers Int
Set @TtlUsers = '7';
--Idle time limit
Declare @iTime DateTime
Set @iTime = '00:05:00';

If 
(
Select COUNT(USERID)
From dbo.LogFile
)>= @TtlUsers

Begin

  Insert Into dbo.ExpiredIdleUsersRmvd
  Select Working, e.USERID, e.CMPNYNAM, USRCLASS, tTime, iTime, LoginDatestamp, GETDATE() As cTime
  From dbo.ExpiredTime e Join inserted i on e.USERID = i.USERID
  Where iTime >= @iTime;

End

1 个答案:

答案 0 :(得分:0)

有些事情会浮现在脑海中。其中一些是基于您发布的程序的推论,所以如果我在那里做出错误的假设,请提前接受我的道歉。

首先,如果根据代码中的“If”块将多于7条记录插入LogFile,您的触发器将会触发,那么您确定这是您想要的吗?

其次,我认为您可能尝试以与其意图交叉的方式使用DateTime。看来你正试图将它用作“经过时间”的持有者,而实际上它正试图保持一个特定的时间点,例如2004年5月23日,上午12:31:11。如果你想测量经过的时间,我希望看到一些DateDiffs ......但仅仅依靠日期的时间部分让我抬起眉毛作为一个可能的问题。您的查询条件“iTime> = iTime”看起来非常像您试图说“他们的闲置时间超过五分钟”,但实际上会查找从完整值推断出的日期of @iTime。

你可能想要考虑一个“LastActivityDate”的声明,然后做一个DateDiff(秒,LastActivityDate,GetDate)> 300来抓住一定数量的空闲时间..

同样,如果我误解了你需要什么,我道歉。

祝你好运。

编辑:更多信息

哦,天哪,我认为你已在视图查询中覆盖了该字段。你将那个约会结果变成一个字符串,它会给你带来各种困难。我建议如下:

  • 修改iTime的视图以返回自last_batch以来现在经过的秒数,例如datediff(second,p.last_batch,getdate())。将它作为一个普通的旧整数返回。
  • 在您的删除测试查询中,只需将iTime与您希望用于经过时间条件的秒数进行比较。根据您的样本,这是五分钟 - > 300秒这消除了你认为是问题根源的所有糟糕的日期时间/字符串比较。

尝试一下,看看会发生什么。