Wie blockiere ich den Benutzerzugriff, um eine Aktualisierung der Datenbankanwendung durchzuführen?

7

Wo ich arbeite, haben wir eine SQL Server-Datenbank (Microsoft SQL Server 2008 R2), die als Back-End mit zwei verschiedenen Benutzeroberflächen dient, einer .NET-Weboberfläche und einer FoxPro-Schnittstelle.

Jeden Monat müssen wir Updates sowohl auf den Web- als auch auf den FoxPro-Client anwenden. Bevor Sie dies tun, sollten Sie sicherstellen, dass während des Aktualisierungsvorgangs niemand auf die Datenbank zugreift.

Was ist der einfachste Weg, um den Zugriff auf die Datenbank zu verhindern, während wir sie aktualisieren? Folgefrage: Wie kann der Zugriff am besten verhindert werden, während wir ihn aktualisieren?

Baodad
quelle

Antworten:

9

Es gibt verschiedene Möglichkeiten, den Zugriff auf eine Datenbank einzuschränken:

  1. Verwenden des LOGON-Triggers - jedoch nur vorübergehend (vor dem Upgrade aktivieren und dann deaktivieren). Weitere Informationen, einschließlich eines Skripts, finden Sie in meiner Antwort hier .
  2. Sie können IIS auf den Webservern herunterfahren, damit mit der Anwendung keine Verbindungen hergestellt werden. Dies wird als "Ausfallzeit der Anwendung" bezeichnet.
  3. Halten Sie die Datenbank im Einzelbenutzermodus mit (Beachten Sie, dass dies riskant ist, da eine andere Verbindung zur Datenbank besteht und Sie möglicherweise warten oder die Verbindung verweigern.)

    alter database databasename
    set single_user with rollback immediately
    

Sie sind besser dran, Option 2 als sicheres und geplantes Upgrade während Ihres Wartungsfensters zu verwenden.

BEARBEITEN:

Eingeschränkter Benutzer - nur Benutzer mit dbo-Rechten für die Datenbank zulässig (z. B. db_owner, dbcreator, sysadmin). Dies bedeutet, dass mehrere Benutzer weiterhin in der Datenbank angemeldet sein können, solange sie DBO sind.

Einzelbenutzer - nur eine Verbindung zulässig, dh wer zuerst kommt, mahlt zuerst.

Aufgrund der Tatsache, dass Einzelbenutzer zuerst kommen, zuerst bedient werden, ist dies im Falle eines Fehlers oder einer Beendigung Ihrer Verbindungen riskanter.

Wenn Sie sich mit dem Anmeldetrigger befassen, wie @AaronBertrand hervorhob, funktioniert dies nicht für vorhandene Sitzungen. Sie können dies jedoch überwinden, indem Sie zuerst alle Sitzungen beenden und dann den Trigger aktivieren, sodass alle neuen eingehenden Verbindungen über den auslösen.

Ich kann mir keine andere Möglichkeit vorstellen, die Verbindungen zur Datenbank einzuschränken.

Kin Shah
quelle
Wir werden IIS definitiv während der Durchführung des Updates herunterfahren, aber ich bin mir nicht sicher, ob dies Anmeldungen vom FoxPro-Client verhindert. Logon Trigger ist möglicherweise die beste Lösung. Was halten Sie vom RESTRICTED_USER-Modus und nicht vom SINGLE_USER-Modus?
Baodad
2
Ich denke, der Anmeldeauslöser ist nicht unbedingt ein guter Weg - bestehende Sitzungen müssen den Auslöser nicht durchlaufen, sodass sie möglicherweise auch nach dem Ändern des Auslösers mehr Arbeit auslösen, um andere Personen fernzuhalten.
Aaron Bertrand
@ Baodad Ich habe meine Antwort mit Details aktualisiert.
Kin Shah
9

Wenn Sie die Datenbank in den eingeschränkten Benutzermodus versetzen, können nur Mitglieder der festen Serverrollen sysadminoder dbcreatoroder Mitglieder der festen Datenbankrolle db_ownerauf die Datenbank zugreifen:

ALTER DATABASE my_app_db SET RESTRICTED_USER

Wenn Sie das Schließen bestehender Verbindungen erzwingen möchten:

ALTER DATABASE my_app_db SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE

Und wenn Sie bereit sind, die Dinge wieder normal zu machen:

ALTER DATABASE my_app_db SET MULTI_USER

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

In diesen Fällen wird der Einzelbenutzermodus nicht empfohlen, da beim Aktualisieren der Anwendung möglicherweise mehrere Verbindungen gleichzeitig geöffnet werden müssen.

db2
quelle
Scheint eine elegante Lösung zu sein, die einfacher ist als Anmeldeauslöser. Ich muss sehen, ob es für unsere Umgebung richtig ist oder ob es laufende Jobs gibt, die uns daran hindern, in den RESTRICTED_USER-Modus zu wechseln.
Baodad
3

Wenn Sie eine bestimmte Gruppe von Benutzern haben, die auf die Datenbank zugreifen, oder nur ein oder zwei Anwendungskonten, die die Datenbankverbindung herstellen, können Sie einfach die Anmeldungen deaktivieren und alle Verbindungen beenden und dann die Anmeldungen erneut aktivieren. wenn du fertig bist.

Cougar9000
quelle
Klicken Sie mit der rechten Maustaste auf das Login in SSMS und klicken Sie auf "Deaktivieren?". Ich werde das versuchen ...
Baodad
1
@ Baodad - Rechtsklick, Eigenschaften, Status, Login
deaktiviert
1
Das könnte genau das sein, was ich brauche. Es ist wirklich nur das Hauptkonto des Webbenutzers, auf das ich den Zugriff blockieren muss, um den Zugriff der Benutzer auf die Hauptanwendung zu verhindern. Vielen Dank!
Baodad
@ Cougar9000 Durch Deaktivieren der Anmeldung werden dadurch alle vorhandenen Verbindungen unterbrochen? So wie Sie es formulieren, scheint es nach dem Deaktivieren der Anmeldung einen zusätzlichen Schritt zu geben, um alle Verbindungen zu beenden. Kannst du bestätigen?
Chris
@ Chris Sie müssen die Sitzung beenden, nachdem Sie die Anmeldung deaktiviert haben. Durch Deaktivieren wird verhindert, dass erneut eine Verbindung hergestellt wird, während Sie versuchen zu arbeiten. Dies ist besonders hilfreich bei Apps zum automatischen erneuten Anmelden und dergleichen
Cougar9000,
1

Ich bin nicht sicher, ob ich verstehe, ob sich Ihr SQL Server auf demselben Computer befindet wie Apps, die darauf zugreifen.

Wenn nicht, können Sie den Firewall-Port für SQL Server einfach für den gesamten eingehenden Datenverkehr deaktivieren, und Sie sind alle gut. Eine weitere Option besteht darin, die IP-Adresse im SQL Server-Konfigurationsmanager zu deaktivieren, der für den Zugriff auf den Server verwendet wird (und nur die lokale IP 127.0.0.1 zu belassen).

Stanley Norman
quelle