web-dev-qa-db-fra.com

Comment bloquer l'accès des utilisateurs pour effectuer la mise à jour de l'application de base de données?

Là où je travaille, nous avons une base de données SQL Server (Microsoft SQL Server 2008 R2) qui sert de back-end avec deux interfaces utilisateur différentes, une interface Web .NET et une interface FoxPro.

Chaque mois, nous devons appliquer des mises à jour aux clients Web et FoxPro. Avant de faire cela, nous vous conseillons de vous assurer que personne n'accède à la base de données pendant le processus de mise à jour.

Quelle est la façon la plus simple d'empêcher l'accès à la base de données pendant que nous la mettons à jour? Question de suivi: Quel est le meilleur moyen d'empêcher l'accès pendant que nous le mettons à jour?

7
Baodad

Vous pouvez restreindre l'accès à une base de données de deux manières:

  1. Utilisation de LOGON Trigger - mais uniquement temporairement (activez avant la mise à niveau, puis désactivez-la). Reportez-vous à ma réponse ici pour plus de détails, y compris un script.
  2. Vous pouvez arrêter IIS sur les serveurs Web afin qu'aucune connexion ne soit établie à l'aide de l'application. Cela s'appelle "Temps d'arrêt d'application "
  3. Gardez la base de données en mode mono-utilisateur en utilisant (Notez que cela sera risqué comme s'il y avait une autre connexion à la base de données, alors vous pourriez finir par attendre ou refuser la connexion.)

    alter database databasename
    set single_user with rollback immediately
    

Vous feriez mieux d'utiliser l'option 2 comme une mise à niveau sûre et planifiée pendant votre fenêtre de maintenance.

MODIFIER:

Utilisateur restreint - seuls les utilisateurs avec des droits dbo sur la base de données sont autorisés (par exemple db_owner, dbcreator, sysadmin). Cela signifie que plusieurs utilisateurs peuvent toujours être connectés à la base de données, tant qu'ils sont DBO.

Utilisateur unique - une seule connexion autorisée, c'est-à-dire premier arrivé, premier servi.

En raison du fait que l'utilisateur unique sera le premier arrivé, premier servi - il sera plus risqué en cas d'erreur ou que vos connexions soient interrompues.

Lorsque vous traitez avec Logon Trigger, comme l'a souligné @AaronBertrand, cela ne fonctionnera pas pour les sessions existantes, mais vous pouvez surmonter cela en supprimant d'abord toutes les sessions, puis en activant le déclencheur de sorte que toutes les nouvelles connexions entrantes doivent passer par le déclencheur.

Je ne peux penser à aucun autre moyen de restreindre les connexions à la base de données.

9
Kin Shah

Si vous mettez la base de données en mode utilisateur restreint, seuls les membres des rôles de serveur fixes sysadmin ou dbcreator, ou les membres du rôle de base de données fixe db_owner peut accéder à la base de données:

ALTER DATABASE my_app_db SET RESTRICTED_USER

Si vous souhaitez forcer la fermeture des connexions existantes:

ALTER DATABASE my_app_db SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE

Et quand vous êtes prêt à remettre les choses à la normale:

ALTER DATABASE my_app_db SET MULTI_USER

Source: http://www.blackwasp.co.uk/SQLRestrictedUser.aspx

Je ne recommande pas le mode mono-utilisateur dans ces cas, car le processus de mise à jour de l'application peut avoir besoin d'ouvrir plusieurs connexions simultanément.

9
db2

Si vous avez un groupe défini d'utilisateurs qui accéderaient à la base de données ou seulement un ou deux comptes d'application qui établissent la connexion à la base de données, vous pouvez simplement désactiver la ou les connexion (s) et tuer toutes les connexions, puis réactiver la ou les connexion (s) quand tu as fini.

3
Cougar9000

Je ne suis pas sûr de comprendre si votre serveur SQL est sur la même machine que les applications qui y accèdent.

Sinon, vous pouvez simplement désactiver le port du pare-feu pour SQL Server pour tout le trafic entrant et tout va bien. Une autre option consiste à désactiver l'adresse IP dans le gestionnaire de configuration SQL Server qui est utilisé pour accéder au serveur (et ne laisser que l'IP 127.0.0.1 locale)

1
Stanley Norman