我是触发器的新手,我遇到了一些困难我试图创建一个触发器,当有人登录我们的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
答案 0 :(得分:0)
有些事情会浮现在脑海中。其中一些是基于您发布的程序的推论,所以如果我在那里做出错误的假设,请提前接受我的道歉。
首先,如果根据代码中的“If”块将多于7条记录插入LogFile,您的触发器将会触发,那么您确定这是您想要的吗?
其次,我认为您可能尝试以与其意图交叉的方式使用DateTime。看来你正试图将它用作“经过时间”的持有者,而实际上它正试图保持一个特定的时间点,例如2004年5月23日,上午12:31:11。如果你想测量经过的时间,我希望看到一些DateDiffs ......但仅仅依靠日期的时间部分让我抬起眉毛作为一个可能的问题。您的查询条件“iTime> = iTime”看起来非常像您试图说“他们的闲置时间超过五分钟”,但实际上会查找从完整值推断出的日期of @iTime。
你可能想要考虑一个“LastActivityDate”的声明,然后做一个DateDiff(秒,LastActivityDate,GetDate)> 300来抓住一定数量的空闲时间..
同样,如果我误解了你需要什么,我道歉。
祝你好运。编辑:更多信息
哦,天哪,我认为你已在视图查询中覆盖了该字段。你将那个约会结果变成一个字符串,它会给你带来各种困难。我建议如下:
尝试一下,看看会发生什么。