Können Sie verhindern, dass mehr als X Zeilen in SQL Server aktualisiert werden?

7

Gibt es eine Möglichkeit, SQL Server so zu konfigurieren, dass die Anzahl der Zeilen begrenzt wird, die eine Update-Anweisung ändern kann? Angenommen, ich wollte, dass das Limit 30.000 Zeilen beträgt, und jemand hat ein Update ausgelöst, das 45.000 Zeilen ändert. Er erhält einen Fehler oder eine andere vorbeugende Meldung.

Chad Cook
quelle
Interessantes Problem, aber warum versuchst du das?
Nick Chammas
Ich weiß nicht viel darüber in dbms 'außer sybase, aber Sie könnten das Transaktionsprotokoll entsprechend einstellen, damit es voll wird und fehlschlägt, wenn Sie auf zu viele Zeilen reagieren.
user606723

Antworten:

7

Ein Auslöser wäre, wie ich damit umgehen würde. Dies verlangsamt alle Ihre Update-Anweisungen, da SQL jetzt eine Menge zusätzlicher Arbeit zu erledigen hat, aber Ihre Anforderungen erfüllt.

CREATE TRIGGER Something on dbo.SomeTable
FOR UPDATE
AS
BEGIN
IF (select count(*) from inserted) > 30000
BEGIN
   RAISERROR('To many rows being processed at one.  Reduce and try again.', 16, 1)
   ROLLBACK
END
END

Persönlich würde ich die Idee nicht mögen, das Update mit einem kleineren Zeilensatz auszulösen, anstatt es auszulösen und erneut anzuwenden, da dies jetzt in schwierige Bereiche von halb abgeschlossenen Vorgängen gerät, die schnell sehr chaotisch werden könnten.

mrdenny
quelle
2
Natürlich müsste auf jeder Tabelle, auf die Sie die Einfügungen beschränken möchten, derselbe Trigger erstellt werden. Hierfür gibt es keine globale Einstellung.
HLGEM
Ja, ausgezeichneter Punkt.
Mrdenny
Dieser Ansatz funktioniert perfekt. Wir müssen ein paar kritische Tabellen sperren, damit sie nicht mit massiven Updates überfrachtet werden.
Chad Cook
5

Sie können dies mit einem AFTER INSERT TRIGGER tun , die Anzahl der Datensätze in der eingefügten Tabelle zählen und das gewünschte Datensatzlimit auf diese Weise behandeln.

Adam Wenger
quelle
2

Sie können auch eine verwenden instead of trigger. Sie würden entweder das Update verwenden SET ROWCOUNT <a number>(das veraltet ist) oder UPDATE TOP <a number>...erneut anwenden (oder einfügen oder was auch immer).

Jon Egerton
quelle