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 ...