2014-12-16 19 views
6

Mi è stato richiesto di configurare un server SQL per consentire solo una sessione per accesso. Ho trovato alcuni riferimenti sulla creazione di trigger di accesso al fine di impedire a un login di stabilire più di una sessione, ma mi chiedo se ci sia un modo per definirlo a un livello più basso, in modo che questo limite di sessione sia l'impostazione predefinita, piuttosto di dover definire questo in un altro login per ogni utente?limitare tutti gli utenti a 1 sessione

Sto vedendo molti riferimenti a questo argomento in entrambe le "domande che potrebbero già avere la tua risposta" e "domande simili" qui su StackOverflow, ma finora non ho trovato o non capito un post che descrive cosa ho sto cercando di fare. Ho anche visto un riferimento su Framework di dichiarazione dichiarativa che consente di configurare SQL Server in base alla politica.

Continuerò a cercare tra gli articoli qui per cercare di imparare questo, ma nel frattempo ... consiglio molto apprezzato!

+0

Potrebbe essere meglio porre questa domanda su [http://security.stackexchange.com/](http://security.stackexchange. it /) –

+0

Suppongo che intenda Microsoft SQL Server. – Gumbo

+0

Tutti gli utenti condividono lo stesso accesso, sono accessi individuali o ereditati da un gruppo di annunci? –

risposta

1

L'esempio per un logon trigger in Libri in linea è abbastanza vicino a quello che penso che si desidera, ho apportato alcune modifiche per farlo funzionare per tutti gli accessi.

-- Trigger must be created by a user with 'view server state' permission in order the trigger to have unrestricted access to sys.dm_exec_sessions. 
create trigger connection_limit_trigger on all server with execute as self for logon 
as 
begin 
    -- Check whether the caller is a SysAdmin. 
    -- Note: The trigger is executing under an elevated security context so we must switch to the caller's context to test their SysAdmin status. 
    declare @IsSysAdmin int 
    execute as caller 
    set @IsSysAdmin = isnull(is_srvrolemember ('sysadmin'), 0) 
    revert 

    -- If the user is not a SysAdmin and there are already too many non-dormant sessions for this login then 'rollback' the logon. 
    -- Note: sys.dm_exec_sessions does not include an entry for this logon attempt. 
    if ((@IsSysAdmin = 0) and ((select count(1) from sys.dm_exec_sessions where is_user_process = 1 and status <> 'Dormant' and original_login_name = original_login()) > 1)) 
    begin 
     raiserror('This login has exceeded the maximum of 1 connections to this SQL Server.', 16, 1) 
     rollback 
    end 
end 

ho aggiunto in un controllo in modo che il limite non si applica ai dati di accesso amministratore di sistema e non conta dormienti connessioni pool di connessioni. Un paio di cose da notare;

  • se la connessione non è chiuso correttamente può rimanere in giro in sys.dm_exec_sessions per un po ', in questo caso l'utente non sarà in grado di ri-collegare finché la connessione morto stessa libera.
  • se si incasina un trigger di accesso è possibile bloccare te stesso (e tutti gli altri!) Da SQL Server. Vedere la pagina logon trigger per i dettagli su come tornare in :)
Problemi correlati