0

我是触发器的新手,并且遇到了一些困难我正在尝试创建一个触发器,当有人登录我们的 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
4

1 回答 1

0

我想到了几件事。其中一些是基于您发布的程序的推论,所以如果我在那里做出了不正确的假设,请提前接受我的道歉。

首先,根据代码中的“If”块,只有在 LogFile 中插入超过 7 条记录时,您的触发器才会触发,所以您确定这就是您想要的吗?

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

您可能需要考虑声明“LastActivityDate”,然后执行 DateDiff(seconds, LastActivityDate, GetDate)> 300 以捕获一定数量的空闲时间。

再次,如果我误解了您的需求,我深表歉意。

祝你好运。

编辑:更多信息

哦,天哪,我认为您已经在视图查询中覆盖了该字段。您正在将该 datediff 结果转换为字符串,这会给您带来各种困难。我会推荐以下内容:

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

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

于 2012-09-29T16:56:06.680 回答