2014-12-16 3 views
6

Мне необходимо настроить SQL Server, чтобы разрешить только один сеанс для входа. Я нашел несколько ссылок на создание триггеров для входа в систему, чтобы запретить логину устанавливать более 1 сеанса, но мне интересно, есть ли способ определить это на более низком уровне, так что этот предел сеанса является значением по умолчанию, а чем определить это в другом логине для каждого пользователя?ограничить всех пользователей до 1 сеанса

У меня есть много ссылок на эту тему как на «вопросы, которые могут уже иметь ваш ответ», и «похожие вопросы» здесь, в stackoverflow, но до сих пор они не нашли или не поняли сообщение, которое описывает, что я я пытаюсь сделать. Я также видел ссылку на Declarative Management Framework, которая позволяет вам настроить SQL Server по правилам, я думаю.

Я собираюсь продолжить просмотр статей здесь, чтобы попытаться изучить это, но в то же время ... совет очень ценится!

+0

Может быть, лучше задать этот вопрос на странице http://security.stackexchange.com/](http://security.stackexchange. com /) –

+0

Я предполагаю, что вы имеете в виду Microsoft SQL Server. – Gumbo

+0

Все ли пользователи используют один и тот же логин, являются ли они отдельными входами или унаследованы от группы AD? –

ответ

1

Пример для logon trigger в Books Online довольно близок к тому, что я думаю, что вы хотите, я внес несколько изменений, чтобы заставить его работать для всех логинов.

-- 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 

Я добавил в чек, так что ограничение не относится к Сисадмин логинов и не учитывает неактивных соединений пула соединений. Несколько вещей, чтобы отметить;

  • , если соединение не закрыта должным образом он может торчать в sys.dm_exec_sessions на некоторое время, в этом случае пользователь не сможет повторно подключиться, пока мертвые соединения не очищает себя.
  • Если вы испортили триггер входа в систему, вы можете заблокировать себя (и всех остальных!) Из SQL Server. См. Страницу logon trigger для получения информации о том, как вернуться обратно :)
Смежные вопросы