2011-11-25 4 views
1

Je cherche une réponse pour créer une procédure stockée pour une table de journal. Voici le scénario pour lequel j'ai besoin d'écrire ce SP.Comment créer une procédure stockée pour une table de journal

Chaque fois que l'utilisateur se connecte ou se déconnecte, stockez le temps LOG-IN et LOG-OUT avec l'ID LOGIN unique de l'utilisateur.

Je dois également empêcher l'utilisateur de se connecter si la session précédente des utilisateurs est terminée de façon anormale ou si l'utilisateur ferme l'application sans se déconnecter correctement, l'utilisateur doit attendre 10 minutes avant la prochaine connexion.

C'est ce que j'ai essayé:

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

Donc vous avez déjà ** votre ** procédure stockée - alors quelle est la question, ** exactement ** ?? –

+0

ya que j'ai ... mais il y a quelques problèmes de performance. Mon TL donne un regard terrifiant quand je lui ai montré ... HHAH – joshua

Répondre

1

c'est ce que je l'ai essayé.

 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

Avez-vous posté la réponse de votre côté? Ou vous avez besoin d'une suggestion? – eeerahul

2

La seule chose qui saute est le fait que vous avez une variable appelée @TEMP de type INT - mais vous comparez comme si elle était une chaîne:

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 

C'est un INT - si vous avez besoin de le comparer à une valeur numérique:

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

aussi - je suis sûr que vous pouvez trouver un plus approprié, plus significatif et plus nom évident pour cette variable que @TEMP ....

Questions connexes