Announcement

Collapse
No announcement yet.

Inaktive Sessions ausfindig machen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Inaktive Sessions ausfindig machen

    Guten Morgen!

    Ich habe folgendes Problem:
    Ich möchte inaktive Sessions, die vier oder mehr Stunden inaktiv sind, aufspüren und beenden. Allerdings nur Sessions, die durch User geöffnet wurden. Sessions durch die Clientapplikation sollen davon ausgenommen sein.

    Mit Hilfe von
    Code:
    exec sp_who @loginame = 'appuser'
    kann ich ja alle Sessions des angegeben Users anzeigen. Wie bekomme ich nun genau das Gegenteil? Nämlich alle Sessions, die NICHT von diesem User sind?

    Oder ist mein Lösungsansatz völlig falsch? Leider habe ich in diesem Sektor noch nicht viel Erfahrung und freue mich über jeden Tipp!

    Grüße
    Sascha

  • #2
    spiel mal mit der DMV

    dm_os_exec_sessions

    Comment


    • #3
      ok dmv heißt:

      sys.dm_exec_sessions

      Comment


      • #4
        Hallo ebis,

        vielen Dank! Das war schon mal ein guter Tipp.

        Ich habe nun folgendes basteln wollen:
        Code:
        select * from sys.dm_exec_sessions
        where  last_request_end_time >= now()-1440000 and login_name <> 'appuser'
        Das gibt aber einen Fehler, da wohl meine Funktion falsch ist. Es geht darum, er soll alle Sessions zeigen, die zuletzt vor 4 Stunden in Verwendung waren und nicht vom User 'appuser' stammen. Das mit dem User klappt, dass mit der Zeitspanne nicht. Sorry, stehe heute irgendwie auf dem Schlauch.

        Grüße
        Sascha

        Comment


        • #5
          unter MS-SQL heißt es anstatt now ()

          GetDate ()

          Comment


          • #6
            Ach ja, GetDate() habe ich sogar schon genutzt! Danke!

            Meine Query schaut nun so aus in funktioniert:
            Code:
            select * from sys.dm_exec_sessions
            where  last_request_end_time <= GetDate()-0.25 and login_name <> 'appuser'
            Ich habe also die inaktive Zeit auf 6 Stunden erhöht. Ich bekomme auch ein Ergebnis, darunter ja die Session ID. Wenn ich diese Session nun beenden wollte, wie müsste ich da vorgehen?

            Ich müsste mir eine StoredProcedure nehmen, in welcher ich das Abfrageergebnis und zwar hier die 'session_id' in eine Variable packe und dann die Session (oder mehrere Sessions) im zweiten Schritt beende.

            Kannst du mir da ein paar Anhaltspunkte geben, wie das aussehen könnte?

            Grüße
            Sascha

            Comment


            • #7
              Kill

              siehe genaueres in BOL

              Comment


              • #8
                Okay, ich habe da mal etwas zusammengeschrieben, was vom Syntax-Check okay zu sein scheint:

                Code:
                CREATE TABLE #temp (
                            spid int
                			) 
                
                INSERT INTO #temp
                SELECT	session_id 
                FROM	sys.dm_exec_sessions
                WHERE	last_request_end_time <= GetDate()-0.25 
                		and login_name <> 'appuser'
                
                DECLARE kill_spids CURSOR FOR
                SELECT spid
                FROM #temp
                
                DECLARE @spid SMALLINT
                
                OPEN kill_spids
                
                FETCH NEXT FROM kill_spids INTO @spid
                
                WHILE @@FETCH_STATUS = 0
                
                BEGIN 
                
                            DECLARE @dynamicsql NVARCHAR(4000)
                            SET @dynamicsql = 'KILL '+CAST(@spid AS CHAR)
                			EXECUTE sp_executesql @dynamicsql
                            FETCH NEXT FROM kill_spids INTO @spid
                
                END
                
                CLOSE kill_spids
                DEALLOCATE kill_spids
                DROP TABLE #temp
                Ich lasse also die in Frage kommenden Session-ids in eine temporäre Tabelle speichern und nutze dann einen Cursor, um die Sessions zu beenden. Diesen Code kann ich dann ja in gewissen Abständen als Job ausführen lassen.

                Ist das eine gute Lösunjg?

                Grüße
                Sascha

                Comment

                Working...
                X