2009-07-23 76 views
1

我有一個觸發器應該更新註銷時間[在註冊時間內產生一個小時內的隨機註銷時間,秒也必須不同],我該如何實現該功能,請在這裏幫助是我的觸發至今:觸發器在SQL Server 2000中

USE TestDB 
GO 
CREATE TRIGGER AfterInsertTG 
ON dbo.usage_reports_Dummy2 
AFTER INSERT AS 

    DECLARE @pk_id as int, @member_id as int,@login_time AS DATETIME,@logout_time AS DATETIME 
    ,@ip AS VARCHAR(255),@session_id AS VARCHAR(255); 
    SELECT 
     @pk_id = pk_id , 
     @member_id = member_id, 
     @login_time =login_time, 
     @logout_time = logout_time, 
     @ip = ip, 
     @session_id = session_id 
    FROM 
     usage_reports_Dummy2 


    IF(@logout_time IS NULL) 

     BEGIN 
     ??????? 
     END  

GO 

謝謝大家幫助我特意埃裏克抽出一些時間和思考的公式,我選擇了馬克的回答,原因是其符合我的條件

這裏是最後的代碼:

CREATE TRIGGER trgInsert 
ON dbo.usage_reports_Dummy2 
INSTEAD OF INSERT 
AS BEGIN 
    INSERT INTO 
     dbo.usage_reports_Dummy2(member_id, login_time, logout_time, ip, session_id) 
      SELECT 
      member_id, login_time, logout_time, ip, session_id 
      FROM inserted 
      WHERE logout_time IS NOT NULL 

    INSERT INTO 
     dbo.usage_reports_Dummy2(member_id, login_time, logout_time, ip, session_id) 
      SELECT 
       member_id, login_time, DATEADD(ss, RAND() * 3600, login_time), 
       ip, session_id 
      FROM inserted 
      WHERE logout_time IS NULL 
END 

回答

0

你可以做的就是創建一個INSTEAD OF INSERT觸發器是這樣的:

CREATE TRIGGER trgInsert 
ON dbo.usage_reports_Dummy2 
INSTEAD OF INSERT 
AS BEGIN 
    INSERT INTO 
     dbo.usage_reports_Dummy2(member_id, login_time, logout_time, ip, session_id) 
      SELECT 
      member_id, login_time, logout_time, ip, session_id 
      FROM inserted 
      WHERE logout_time IS NOT NULL 

    INSERT INTO 
     dbo.usage_reports_Dummy2(member_id, login_time, logout_time, ip, session_id) 
      SELECT 
       member_id, login_time, DATEADD(ss, RAND() * 3600, login_time), 
       ip, session_id 
      FROM inserted 
      WHERE logout_time IS NULL 
END 

這樣一來,如果提供了「logout_time」的值存儲「原樣」,如果沒有,那麼您的logout_time是根據您的要求計算的。

馬克

1

您可以使用newid爲您生成一個隨機序列,然後將其發送到checksum以獲取int,然後以將其轉換爲3600(一小時內的秒數)。使用dateadd函數,您可以將該隨機數量的秒添加到@login_time

select @logout_time = dateadd(ss, checksum(newid()) % 3600, @login_time) 

應當指出的是,rand只返回每條語句一個值,因此所有的行會都@login_time@logout_time之間相同的方差。

但是,如果是單行,那麼這個效果很好:

select @logout_time = dateadd(ss, rand() * 3600, @login_time) 
+0

感謝您的幫助,但它給我無效參數錯誤DATEADD指定 無效的參數1。 – Developer 2009-07-23 20:30:10

+0

它應該是DATEADD(ss,rand()* 3600,@login_time) - 周圍沒有引號 – 2009-07-23 21:04:36

+0

已修復。對於那個很抱歉。 – Eric 2009-07-23 21:05:51

0

你有writng觸發瞭解的第一件事是,你不能假設只有一個記錄將在同一時間進行處理。所以首先你需要重新思考你的過程,不要用那種方式來使用變量。必須編寫觸發器來說明基於集合的操作。

觸發器有兩個插入和刪除的僞標記,用於存儲所需的信息。在你的情況下插入有你想要的。這樣的事情(使用上面的想法)可能的工作:

update u 
set logout_time = dateadd(ss, checksum(newid()) % 3600, login_time) 
from usage_reports_Dummy2 u 
join inserted i on u.id = i.id 
where logout_time is null 

這將更新是在礦井當前插入anyrecords沒有一個logout_time基於onthe公式DATEADD(「SS」,校驗隨機值( newid())%3600,login_time)。

測試這個,看看它會做什麼。公式可能需要調整。