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 AM などの特定の時点を保持しようとしているときに、「経過時間」ホルダーとして使用しようとしているようです。経過時間を測定しようとしている場合は、いくつかの DateDiffs が表示されることを期待します...しかし、日付の時間部分に依存するだけで、考えられる問題として眉をひそめます。クエリ条件「where iTime >= iTime」は、「アイドル時間が 5 分を超えている場所」と言おうとしているように見えますが、実際には、次の完全な値から推測される日付を探します。 @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 に答える