Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Acionadores de logon no SQL Server


Um gatilho de logon, como o nome sugere, é um gatilho que é acionado em resposta a um evento LOGON no SQL Server.

Em termos simples, um gatilho de logon é acionado sempre que alguém tenta estabelecer uma nova conexão com um servidor de banco de dados. O gatilho é acionado depois que a autenticação do usuário e a fase de login são concluídas, mas antes que a sessão do usuário seja realmente iniciada.

Vantagens dos acionadores de logon


Há várias vantagens dos gatilhos de logon:
  • Acompanhamento da atividade de login
    Os gatilhos de logon podem ser usados ​​para acompanhar a atividade de logon que ocorre no servidor de banco de dados. Por exemplo, ele pode ser usado para manter uma lista de todos os usuários que efetuaram login no servidor de banco de dados dentro do período de tempo especificado.
  • Restringindo o número total de conexões
    Muitos logins de banco de dados podem afetar o desempenho de um banco de dados, principalmente quando um grande número de usuários está acessando um banco de dados. Em casos como esses, os gatilhos de logon podem ser usados ​​para verificar o número total de logons já existentes antes que mais sejam permitidos.
  • Restringindo o número de sessões por conexão
    Um gatilho de logon pode ser usado para limitar o número de sessões por conexão. Sempre que um usuário tenta estabelecer uma nova sessão, um acionador de logon pode verificar o número de sessões que já estão ativas para esse logon e pode restringir quaisquer novas sessões caso tenham excedido um limite.

Antes de começarmos, certifique-se de ter feito o backup completo.

Acessando conexões de usuário ativo


O script a seguir retorna todas as conexões de usuário ativas a um banco de dados.
SELECT * FROM sys.dm_exec_sessions

sys.dm_exec_sessions é uma exibição do sistema que retorna todas as conexões de usuário ativas. A saída da consulta acima é assim:



A saída contém informações detalhadas sobre todas as conexões ativas. Estamos interessados ​​em duas dessas colunas:is_user_process e original_login_name.
A primeira informa se a conexão foi feita por um processo de usuário ou não, e a primeira contém informações sobre o nome da conexão que fez o login.

Execute a seguinte consulta:
SELECT is_user_process, original_login_name, *
FROM sys.dm_exec_sessions ORDER BY login_time DESC

A consulta acima retorna is_user_process e original_login_name como a primeira e a segunda colunas junto com o restante de todas as colunas da exibição sys.dm_exec_sessions. Ele classifica os resultados por ordem decrescente do horário de login. Assim, as conexões mais recentes aparecem no topo.

Na saída, role para baixo até as linhas em que a coluna is_user_process contém um 1.

No meu caso, tenho duas linhas, conforme mostrado na saída abaixo:



Na coluna original_login_name, você pode ver o nome da conexão que fez o login (neste caso o nome do meu PC). Na coluna program_name, você pode ver o tipo de conexão. No caso acima, a conexão com o session_id 51 é a conexão com o SQL Server Object Explorer. A conexão com o session_id 52 é a conexão para a única janela de consulta na qual o script está sendo executado. Se você tiver duas janelas de consulta abertas, verá um total de três conexões de usuário aqui e assim por diante.

Para contar o número total de conexões feitas pelos processos do usuário, execute a seguinte consulta:
SELECT COUNT(*) FROM sys.dm_exec_sessions 
WHERE is_user_process = 1

A consulta acima retorna dois, pois tenho apenas duas conexões user_process no meu servidor.

Acionador de logon para limitar o número de logons


Vamos criar um gatilho de logon simples que limite o número total de logins que podem ser feitos por uma conexão a 3. Se a conexão tentar efetuar login no servidor de banco de dados pela quarta vez, o gatilho de logon reverterá o processo de logon.

O script para este gatilho é o seguinte:
CREATE TRIGGER tr_CheckLogin
ON ALL SERVER
FOR LOGON
AS
BEGIN
	DECLARE @login NVARCHAR(100)
	SET @login = ORIGINAL_LOGIN()

	IF
	(SELECT COUNT(*) FROM sys.dm_exec_sessions 
	WHERE is_user_process = 1
	AND original_login_name = @login) > 3
	BEGIN
	Print 'More than three connections not allowed - Connection by ' + @login + ' Failed'
	ROLLBACK
	END

END

No script acima criamos uma trigger chamada tr_CheckLogin. O escopo do gatilho é definido como servidor.

Você pode visualizar os detalhes do gatilho acessando Object Explorer -> Server Objects -> Triggers, conforme mostrado na figura abaixo:



O gatilho é acionado sempre que o evento LOGON ocorre, ou seja, uma conexão tenta fazer login no servidor. Dê uma olhada cuidadosa no corpo do gatilho.

A função ORIGINAL_LOGIN retorna o nome do processo do usuário ou a conexão tentando efetuar login no servidor. Em seguida, o número total de conexões com o mesmo nome é contado usando a exibição sys.dm_exec_session. Se o número de conexões for maior que 3, o login é revertido e uma instrução é impressa para o usuário que diz:"Mais de três conexões não permitidas - Falha na conexão por 'nome_da_conexão'".

Para verificar isso, abra uma nova janela de consulta no estúdio de gerenciamento do SQL Server

Observação:anteriormente, havia duas conexões abertas, uma para o SQL Server Management Studio e outra para a janela Consulta.

Quando você tenta abrir uma nova janela de consulta, o gatilho tr_CheckLogin será acionado, mas como o número total de logins será três neste momento, o gatilho não reverterá o login.

Para verificar o número total de conexões por user_process, execute a seguinte consulta:
SELECT COUNT(*) FROM sys.dm_exec_sessions 
WHERE is_user_process = 1

Agora, há um total de 3 conexões de usuário, conforme mostrado na saída:



Agora, tente novamente criar uma nova conexão abrindo uma nova janela de consulta no SQL Server Management Studio.

Você verá o seguinte erro:



O erro diz que o login falhou para “DESKTOP-GLQ5VRA\Mani” (o nome do meu PC) devido à execução do gatilho. Basicamente, o gatilho que criamos não permitia a conexão. Esperar! Mas onde está a mensagem de erro que imprimimos? Não podemos vê-lo aqui na caixa de mensagem acima. A mensagem de erro personalizada que escrevemos no gatilho pode ser visualizada no log de erros.

Para visualizar o log de erros, execute o seguinte script:
EXECUTE sp_readerrorlog

Role para baixo no log de erros até encontrar a mensagem personalizada que você escreveu para o gatilho de logon. A captura de tela a seguir mostra o log de erros do meu servidor de banco de dados. A mensagem personalizada pode ser vista no log de erros:


Leitura adicional:

  • YouTube:acionadores de logon do SQL Server
  • Microsoft.com:acionadores de logon
  • Estudos SQL:como escapar de um gatilho de logon em fuga