Was entspricht --safe-Updates von MySQL in MS SQL Server?

Antworten:

10

Möglicherweise gibt es so etwas in MS SQL oder nicht, aber warum sollten Sie das wollen?

Es gibt bereits eine Möglichkeit, die UPDATEAuswirkungen einzuschränken (die WHEREKlausel).
Es gibt bereits einen Mechanismus zum Schutz Ihrer Daten bei Änderungen (Transaktionen).

Wenn wir beide kombinieren, erhalten wir die allgemeine Lösung: "Führen Sie Ihre Aktualisierungen in einer Transaktion mit den entsprechenden WHERE-Klauseln durch, um zu begrenzen, was sie berühren, und stellen Sie sicher, dass die Ergebnisse richtig aussehen, bevor Sie sich verpflichten":

> BEGIN;
> UPDATE mytable SET foostring='NewValue' WHERE id > 16 AND id < 32;
15 Rows Updated

> SELECT * FROM mytable;

  [Omitted -- Make sure it looks right]

> COMMIT;  --- Or ROLLBACK if the SELECT doesn't look right
voretaq7
quelle
Dies ist nützlich, da Sie den Schaden, der verursacht werden kann, effektiv begrenzen können, wenn ein nicht autorisierter Benutzer auf Ihre Datenbank zugreift oder wenn Sie betrunken oder betrunken sind.
Benutzer893730
4
Wenn ein nicht autorisierter Benutzer irgendwie auf Ihre Datenbank zugreift, haben Sie größere Probleme. Wenn Sie betrunken oder auf andere Weise betrunken arbeiten. . . NICHT .
voretaq7
3
@ user893730: Der "nicht autorisierte Benutzer" kann einfach "SET sql_safe_updates = 0;" ausführen. (
Ganz
1
Entschuldigung, ich erinnere mich jetzt, dass der Grund, warum dies in MySQL eingefügt wurde, gerechtfertigt war, da Sie Ihre Daten möglicherweise versehentlich beschädigen. Daher können Sie diesen Schaden hier begrenzen, wenn Sie nicht wirklich
vorhaben,
Warum ist die Sprache so aufgebaut? Wenn nach dem Aktualisieren oder Löschen ein Schlüsselwort "ALL" hinzugefügt werden musste, werden versehentliche Änderungen an der Tabelle verhindert. Außerdem kann das Management Studio vor dem Ausführen der Abfrage überwachen, ob es sich um ein Löschen oder Aktualisieren ohne where-Klausel handelt.
Ronen Festinger
5

Es ist pro Abfrage mit TOP, wenn Sie möchten.

UPDATE TOP(100) Production.ProductInventory
SET Quantity = 400
WHERE Quantity < 300;

SET ROWCOUNT hat Nebenwirkungen auf Zwischenzählungen, die zu irreführenden Ergebnissen führen, weshalb es langsam veraltet ist. Das erste MSDN-Beispiel zeigt dies

Glücklicherweise verfügt SQL Server als erwachsenes RDBMS über Datenbank-Snapshots und konsistente Online-Backups, die eine Wiederherstellung zu einem bestimmten Zeitpunkt ermöglichen, falls Sie dies nicht tun ...

gbn
quelle
1
Coole Funktion, @gbn. Ich werde später abstimmen, da ich heute an meinem Limit für Stimmen bin !!!
RolandoMySQLDBA
Wie versprochen +1 !!!
RolandoMySQLDBA
Auf jeden Fall eine coole Funktion! @gbn - Ist das aus Neugier Teil des SQL-Standards oder eine MS SQL-Erweiterung? (Ich sehe keinen Hinweis darauf in den Postgres-Dokumenten, aber wenn es Teil des Standards ist, werde ich jammern und dafür
sorgen
TOP ist nicht Standard.
Gbn
4

Ich glaube nicht - eines der ersten Dinge, die ich gelernt habe, war, zuerst eine SELECT-Anweisung mit den richtigen WHERE-Klauseln zu schreiben, um sicherzustellen, dass sie richtig ist, und dann SELECT in ein UPDATE zu ändern.

Peter Schofield
quelle
1

Wenn Sie diese Art von Verhalten nachahmen möchten, können Sie nur die Anzahl der Zeilen mit TSQL begrenzen.

Hier ist ein Beispiel aus den SQL Server-Dokumenten:

SET ROWCOUNT 4;
UPDATE Production.ProductInventory
SET Quantity = 400
WHERE Quantity < 300;
GO

Laut http://msdn.microsoft.com/en-us/library/ms188774.aspx :

Die Verwendung von SET ROWCOUNT wirkt sich in der nächsten Version von SQL Server nicht auf die Anweisungen DELETE, INSERT und UPDATE aus. Verwenden Sie SET ROWCOUNT nicht mit den Anweisungen DELETE, INSERT und UPDATE in neuen Entwicklungsarbeiten und planen Sie, Anwendungen zu ändern, die es derzeit verwenden. Für DELETE-, INSERT- und UPDATE-Anweisungen, die derzeit SET ROWCOUNT verwenden, empfehlen wir, sie neu zu schreiben, um die TOP-Syntax zu verwenden. Weitere Informationen finden Sie unter DELETE (Transact-SQL), INSERT (Transact-SQL) oder UPDATE (Transact-SQL).

Daher kann SQL Server 2012 nicht SET ROWCOUNTmit der oben genannten DML arbeiten.

Wenn Sie Bedenken haben, die unbeabsichtigt destruktiv sein können:

  • Führen Sie keine automatische Festschreibung durch
  • Starten Sie SQL Server nicht im Einzelbenutzermodus (da die CHECKPOINT-Dienste deaktiviert sind, wodurch die automatische Festschreibung effektiv erfolgt).

Abgesehen von diesen Dingen liegen alle anderen Funktionen der --safe-Updates von mysql in Ihrer Verantwortung.

RolandoMySQLDBA
quelle
3
Sie würden tatsächlich UPDATE TOP (4) Production.ProductInventory ...seit SQL Server 2005 verwenden ...
gbn