Wie erstelle ich einen Benutzer für SQL Server, dessen Abfragen (alle / alle) zeitlich begrenzt sind?

7

Gibt es eine Möglichkeit, einen Datenbankbenutzer in SQL Server 2005 so zu erstellen, dass keine ihrer Abfragen ein bestimmtes Zeitlimit (z. B. 20 bis 30 Sekunden) überschreitet oder alle Abfragen auf eine bestimmte Anzahl von Zyklen beschränkt sind - und dann die Zeitüberschreitung bei Abfragen - dh verhindert, dass dieser Benutzer wirklich signifikante Ressourcen pro Abfrage verbraucht?

Kennt jemand einen Weg, dies zu tun?

Vielen Dank!

Faisal Vali
quelle
Wenn Sie "Benutzer" sagen, meinen Sie damit die Steuerung der Ressourcen für einen bestimmten Datenbankbenutzer oder für eine Serveranmeldung?
Jon Seigel
für einen bestimmten Datenbankbenutzer
Faisal Vali
Meinen Sie mit VERBINDUNG?
JNK
Ich dachte an eine Verbindung mit diesem Datenbank-Login - aber wenn Sie eine Methode haben, um sie basierend auf der IP zu begrenzen, von der die Abfrage kommt - das wäre auch nützlich -
Faisal Vali

Antworten:

4

Es gibt Wege, aber nichts, was perfekt ist.

Wenn der Benutzer nur über eine Datenschicht auf die SQL Server-Datenbank zugreift (z. B. wenn der Benutzer nur eine bestimmte Webanwendung durchläuft und keine Verbindung mit SQL Server Management Studio herstellt), kann die Antwort von George Mavritsakis funktionieren. Wenn sie jedoch eine Verbindung über SSMS herstellen, müssen Sie noch einen Schritt weiter gehen.

Sie können das query governor cost limit(in sp_configure) auf ein bestimmtes Zeitlimit festlegen , dies betrifft jedoch standardmäßig alle Benutzer. Dies beendet eine Abfrage, wenn die erwartete Zeit größer als Ihr Maximum ist. Beachten Sie, dass die erwartete Zeit von Statistiken abhängt und komplexere Abfragen Ihre Berechnungen beeinträchtigen können.

Wenn Sie dies nur für eine Anmeldung tun möchten, können Sie einen Anmeldetrigger erstellen und ausführen, wenn diese Anmeldung Ihr ressourcenverschwendender Benutzer ist

SET QUERY_GOVERNOR_COST_LIMIT 600 --or whatever value you want

im Abzugskörper. Beachten Sie erneut, dass der Gouverneur eher geschätzte als tatsächliche Zeiten verwendet, sodass dies nicht kinderleicht ist. Es würde jedoch einen Versuch stoppen, eine select *Tabelle mit 10 Millionen Zeilen zu erstellen, wenn dies das eigentliche Problem ist, das Sie haben.

Der Nachteil beim Erstellen eines Anmeldetriggers besteht darin, dass Sie sich daran erinnern müssen, dass er vorhanden ist. Wie bei allen anderen Arten von Auslösern kann es zu "unerwartetem" Verhalten kommen, wenn jemand, der sich dessen nicht bewusst ist (z. B. Ihr eventueller Ersatz), versucht, herauszufinden, warum diese Person immer wieder seltsame Fehlermeldungen erhält.

Beachten Sie, dass Microsoft in neueren Versionen vom Abfrage-Governor abgewichen ist, insbesondere weil sie zum Ressourcen-Governor gewechselt sind. Aber es ist noch im Jahr 2012 (und scheint nicht veraltet zu sein) und wenn Sie auf 2005 stecken, denke ich, dass das kein Problem ist ...

Kevin Feasel
quelle
1
Sie können query_governor_cost_limitin einem Anmeldetrigger nicht im Namen eines Benutzers festlegen (tatsächlich können Sie dies, aber die Einstellung funktioniert während der Lebensdauer des Auslösers, nicht während der Benutzersitzung, wie man denkt). Es ist auch wichtig zu beachten, dass dies query governor cost limiteine erweiterte Option ist. Daher sollten Sie zuerst ausführen exec sp_configure 'show advanced options', 1, um diese Option ändern zu können.
Diego Queiroz
1

Ich fürchte, es ist nicht möglich, das Limit im Anmeldetrigger festzulegen. Die Verwendung von SET im Anmeldetrigger ist zwecklos, da der Befehl SET nur im Kontext des Triggers funktioniert (dh vom Befehl zur END-Anweisung). Sobald die Sitzung die Ausführung des Triggers beendet hat, wird der Wert auf seinen ursprünglichen Wert zurückgesetzt.

MartinS
quelle
0

Ich denke, Sie sollten dies unter dem Gesichtspunkt der DAL (Data Access Layer) steuern. Stellen Sie dort Zeitüberschreitungen ein. Für ADO.NET können Sie beispielsweise im Befehl ein Zeitlimit festlegen, das für jeden Benutzer unterschiedlich ist.

George Mavritsakis
quelle