2012-09-29 275 views
0

我是觸發器的新手,我有一些困難我試圖創建一個觸發器,當有人登錄到我們的WMS時,它會記錄用戶已登錄WMS多久以及他們已經多久閒置。我最初創建了這個存儲過程,它工作的很好,但當我試圖把它變成一個觸發器時,它不做任何事情或返回一個錯誤。SQL Server 2008 R2創建觸發器

我已經嘗試將整個代碼放入觸發器中,並將觸發器指向存儲過程。

這是我目前的代碼,即使已滿足基本條件,也沒有任何反應。

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

想到了幾件事情。其中一些是基於您發佈的程序的推論,所以如果我在那裏做出了錯誤的假設,請提前接受我的道歉。

首先,如果有多於7條記錄被插入到LogFile中,則通過代碼中的「If」塊,觸發器纔會觸發,那麼您確定這就是您想要的嗎?

其次,我認爲你可能試圖以一種與它的意圖交叉的方式使用DateTime。看起來你試圖將它用作「經過時間」的持有者,實際上它試圖保持一個特定的時間點,例如2004年5月23日,上午12:31:11。如果你正在嘗試測量已用時間,我希望看到一些DateDiffs ...但只是依靠日期的時間部分讓我提高眉毛可能是一個可能的問題。你的查詢條件,「iTime> = iTime」看起來非常像你試圖說「他們的空閒時間超過五分鐘」,但實際上會尋找一個日期,從日期@iTime。

你可能要考慮一個「LastActivityDate」的聲明,然後做一個則DateDiff(秒,LastActivityDate,GETDATE)> 300趕上空閒時間一定量的..

同樣,如果我誤解你需要什麼,我的道歉。

祝你好運。

編輯:更多信息

哦,天哪,我想你已經覆蓋在您的視圖查詢字段。你正在將那個過時的結果變成一個字符串,它會給你帶來各種困難。我想提出以下建議:

  • 修改該視圖ITIME返回的,因爲last_batch經過的秒數,現在,如DATEDIFF(第二,p.last_batch,GETDATE())。以普通的舊整數形式返回它。
  • 在您的移除測試查詢中,只需將iTime與您希望用於所用時間標準的秒數進行比較即可。根據你的樣本,這是五分鐘 - > 300秒。這消除了你所做的所有冒險的日期時間/字符串比較,我認爲這是你問題的根源。

試一下,看看會發生什麼。

+0

7條記錄僅用於測試,實際值將> 35。我不想以35或更多的臨時用戶登錄。 dbo.ExpiredTime是一個視圖,iTime只是我從這個角度給這個領域的一個名字。實際時間來自sys表並稱爲ElapsedTime。 5分鐘僅用於測試實際時間將是2小時或更長時間。 – user1009629

+0

好的。我仍然認爲你的問題在於你如何使用DateTime ......你顯然打算用這種比較來衡量已用時間,但它確實在比較兩個日期值......這可能是你的問題。 –

+0

我真的很感謝你的幫助,我一直在爲此摔跤超過兩週。那麼,爲什麼這會在觸發器中給我一個問題,而不是存儲過程。有DateDiffs,但它們在視圖中.cTime只是記錄用戶從WMS中刪除的時間。是否可以快捷整個事情,只需觸發觸發存儲過程。我的目標是首先檢查有多少用戶,多長時間登錄,多長時間活動,然後在滿足適當條件時寫入表格。之後,第二個過程將觸發,將從選擇表中刪除這些用戶 – user1009629