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!
sql-server
sql-server-2005
Faisal Vali
quelle
quelle
Antworten:
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
(insp_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
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 ...
quelle
query_governor_cost_limit
in 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 diesquery governor cost limit
eine erweiterte Option ist. Daher sollten Sie zuerst ausführenexec sp_configure 'show advanced options', 1
, um diese Option ändern zu können.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.
quelle
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.
quelle