2011-11-25 54 views
1

我正在查找为日志表创建存储过程的答案。以下是我需要编写该SP的场景。如何为日志表创建存储过程

无论何时用户使用用户唯一的LOGIN-ID登录或注销存储登录和退出时间。

此外,我必须限制用户登录,如果用户以前的会话异常终止或用户关闭应用程序没有正确注销,然后用户需要等待10分钟才能下一次登录。

这是我的尝试:

ALTER PROCEDURE USP_CHECKER(@LOGINID VARCHAR(70)) 
AS 
BEGIN 
    DECLARE @LASTID INT,@CURRENTTIME DATETIME,@TEMP INT,@HAS VARCHAR(30) 
    SELECT TOP 1 SLNO, @TEMP=(DATEDIFF(MI,LOGINDATETIME,GETDATE())) FROM TBL_LOGINDETAILS ORDER BY SlNo DESC 

    SET @HAS=(SELECT LoginID FROM TBL_LOGINDETAILS WHERE LogoutDateTime IS NULL) 
    IF @HAS IS NOT NULL 
    BEGIN 
    IF(@TEMP >= '10') 
     BEGIN 
     SET @CURRENTTIME = (SELECT DATEADD(MI, -10, GETDATE())) 
     UPDATE TBL_LOGINDETAILS SET [email protected] WHERE [email protected] 
     END 
    ELSE 
    RETURN @LASTID 
    --PREVENT FROM LOGIN 
    END 
    ELSE 
    INSERT INTO TBL_LOGINDETAILS (LoginID,LoginDateTime,isLogged) VALUES(@LOGINID,GETDATE(),'1') 
END 
+0

所以你已经**有**你的存储过程 - 所以这是什么问题,**完全**? –

+0

亚我有...但有一些性能问题。当我把它展示给她时,我的TL给人一种恐惧的样子...... HHAH – joshua

回答

1

这是我尝试过。

 USE [DB] 
GO 
/****** Object: StoredProcedure [dbo].[USP_SetLoginStatus] Script Date: 11/28/2011 10:58:47 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
ALTER PROCEDURE [dbo].[USP_SetLogStatus] 
    -- Add the parameters for the stored procedure here 
     @PLoginName  Varchar(75) 
AS 
BEGIN 
    DECLARE @SNO INT --VARIABLE TO HOLD THE SERAIL NUMBER 
    ,@ISLOGGED BIT  --HOLDING IS LOGGED STATUS 
    ,@TIMEDIFF VARCHAR(50) --VARIABLE TO HOLD TIME DIFFERENCE BETWEEN CURRENT LOGIN AND LAST LOG OUT TIME 

    -- SELECT QUERY FOR GETTING @TIMEDIFF AND SERIAL-NO VALUES FOR USER 

    SELECT @SNO=[SlNo],@ISLOGGED=[isLogged] ,@TIMEDIFF =DATEDIFF(MI, 
    (SELECT TOP (1) [LoginDateTime] FROM TBL_LOGINDETAILS WHERE [LogoutDateTime] IS NULL ORDER BY [SlNo]), 
    GETDATE()) FROM TBL_LOGINDETAILS WHERE [LoginID][email protected] 

    --IF USER IS LOGIN FIRST TIME 

    IF NOT EXISTS(SELECT isLogged FROM TBL_LOGINDETAILS WHERE [LoginID][email protected]) 
    INSERT INTO TBL_LOGINDETAILS(LoginID,isLogged,LoginDateTime) VALUES(@PLoginName,'1',GETDATE()) 
    ELSE 
    BEGIN 
     IF (@TIMEDIFF >=10) --LOGOUT TIME DIFF IS MORE THAN OR EQUALS TO 10 MINUTE 

    BEGIN 
     ----- UPDATING LOGOUT AND IS LOGGED FIELD 
     IF(@ISLOGGED =1) 
     BEGIN 
      UPDATE TBL_LOGINDETAILS SET [LOGOUTDATETIME]= (SELECT DATEADD(MI, -10, GETDATE())), [isLogged]=0 WHERE [LoginID][email protected] 
      AND [SlNo][email protected] 

     ----- INSERTING NEW LOG FOR CURRENT USER 

     INSERT INTO TBL_LOGINDETAILS([LoginID],[LoginDateTime],[isLogged]) VALUES(@PLoginName,GETDATE(),1) 
     END 
    ELSE 
     UPDATE TBL_LOGINDETAILS SET [LOGOUTDATETIME]= GETDATE() , [isLogged]=0 WHERE [LoginID][email protected] AND [SlNo][email protected] 
    END 
    ELSE 

    RETURN '0' 
    END 

END 
+0

你是否从你身边发布了答案?或者你需要一个建议? – eeerahul

2

一件事情跳出来的是你有一个变量,名为INT@TEMP事实 - 但你要比较,就好像它是一个字符串:

IF(@TEMP >= '10') -- unnecessary single quotes! You're comparing against a string literal... 
BEGIN 
     SET @CURRENTTIME = (SELECT DATEADD(MI, -10, GETDATE())) 
     UPDATE TBL_LOGINDETAILS SET [email protected] WHERE [email protected] 
END 

这是一个INT - 所以你需要把它比对数值:

IF(@TEMP >= 10) -- **NO** unnecessary single quotes.... 
BEGIN 
    UPDATE dbo.TBL_LOGINDETAILS 
    SET LogoutDateTime = DATEADD(MI, -10, GETDATE()) 
    WHERE SLNO = @LASTID 
END 

而且 - 我肯定,你可以找到更适合自己,更有意义和更明显的名称,此变量比@TEMP ....