Onde trabalho temos um banco de dados SQL Server (Microsoft SQL Server 2008 R2) que serve como back-end com duas interfaces de usuário diferentes, uma interface web .NET e uma interface FoxPro.
Todos os meses, precisamos aplicar atualizações aos clientes Web e FoxPro. Antes de fazer isso, é aconselhável certificar-se de que ninguém está acessando o banco de dados durante o processo de atualização.
Qual é a maneira mais fácil de impedir o acesso ao banco de dados enquanto o atualizamos? Pergunta de acompanhamento: Qual é a melhor maneira de impedir o acesso enquanto o atualizamos?
Se você colocar o banco de dados no modo de usuário restrito, somente membros das funções de servidor fixas
sysadmin
oudbcreator
, ou membros da função de banco de dados fixadb_owner
poderão acessar o banco de dados:Se você deseja forçar o fechamento de conexões existentes:
E quando você estiver pronto para colocar as coisas de volta ao normal:
Fonte: http://www.blackwasp.co.uk/SQLRestrictedUser.aspx
Não recomendo o modo de usuário único nesses casos, pois o processo de atualização do aplicativo pode precisar abrir várias conexões simultaneamente.
Existem algumas maneiras de restringir o acesso a um banco de dados:
Mantenha o banco de dados no modo de usuário único usando (Observe que isso será arriscado, pois se houver qualquer outra conexão com o banco de dados, você pode acabar esperando ou recusando a conexão.)
É melhor usar a Opção 2 como uma atualização segura e planejada durante a janela de manutenção.
EDITAR:
Usuário restrito - somente usuários com direitos dbo no banco de dados permitidos (por exemplo, db_owner, dbcreator, sysadmin). Isso significa que vários usuários ainda podem estar logados no banco de dados, desde que sejam DBO.
Usuário único - apenas uma conexão permitida, ou seja, primeiro a chegar, primeiro a ser servido.
Devido ao fato de que o usuário único será o primeiro a chegar, primeiro a ser servido - será mais arriscado em caso de erro ou de alguma forma suas conexões serem encerradas.
Ao lidar com o Logon Trigger, como @AaronBertrand apontou, ele não funcionará para sessões existentes, mas você pode superar isso primeiro matando todas as sessões e, em seguida, ativando o gatilho para que todas as novas conexões de entrada tenham que passar pelo acionar.
Não consigo pensar em nenhuma outra maneira de restringir as conexões ao banco de dados.
Se você tiver um grupo definido de usuários que acessariam o banco de dados ou apenas uma ou duas contas de aplicativos que fazem a conexão com o banco de dados, você pode simplesmente desabilitar o(s) login(s) e matar todas as conexões, e então reativar o(s) login(ns) quando você estiver pronto.
Não tenho certeza se entendi se o SQL Server está na mesma máquina que os aplicativos que o estão acessando.
Caso contrário, você pode simplesmente desabilitar a porta do firewall para o SQL Server para todo o tráfego de entrada e tudo bem. Outra opção é desabilitar o endereço IP no gerenciador de configuração do SQL Server que é usado para acessar o servidor (e deixar apenas o IP local 127.0.0.1)