Anzahl der Zeilen, die vor der Aktualisierung im Trigger betroffen sein sollen

8

Ich möchte wissen, wie viele Zeilen von UPDATE query in BEFORE pro Anweisung trigger betroffen sind. Ist das möglich?

Das Problem ist, dass ich nur Abfragen zulassen möchte, die bis zu 4 Zeilen aktualisieren. Wenn die Anzahl der betroffenen Zeilen 5 oder mehr beträgt, möchte ich den Fehler erhöhen.

Ich möchte das nicht im Code machen, weil ich diese Überprüfung auf db-Ebene brauche. Ist das überhaupt möglich?

Vielen Dank im Voraus für Hinweise auf diese

    
sbczk 01.04.2010, 13:41
quelle

6 Antworten

1

Ich habe so etwas erstellt:

%Vor%

Die Hauptidee ist, einen Trigger für 'vor dem Update für jede Zeile' zu haben, der (falls notwendig) eine temporäre Tabelle erzeugt (die am Ende der Transaktion gelöscht wird). In dieser Tabelle gibt es nur eine Zeile mit einem Wert, das ist die Anzahl der aktualisierten Zeilen in der aktuellen Transaktion. Für jede Aktualisierung wird der Wert erhöht. Wenn der Wert größer als 4 ist, wird die Transaktion gestoppt.

Aber ich denke, das ist eine falsche Lösung für Ihr Problem. Was ist ein Problem beim Ausführen einer solchen falschen Abfrage, über die Sie schon zweimal geschrieben haben, so dass Sie 8 Zeilen geändert haben? Was ist mit Zeilen löschen oder abschneiden?

    
Szymon Lipiński 01.04.2010, 20:51
quelle
2

Simon hatte eine gute Idee, aber seine Umsetzung ist unnötig kompliziert. Das ist mein Vorschlag:

%Vor%     
Tometzky 02.04.2010 13:27
quelle
2

Schreiben Sie eine Funktion, die die Zeilen für Sie aktualisiert oder einen Rollback durchführt. Sorry für schlechte Formatierung.

%Vor%

Dann nenne es wie

%Vor%

wobei der erste Parameter Ihre SQL-Anweisung und die 2. Ihre maximalen Zeilen sind.

    
oli 01.04.2010 14:32
quelle
1

PostgreSQL hat zwei Triggerarten : Zeilen- und Kontoauslöser. Zeilentrigger funktionieren nur im Kontext einer Zeile, so dass Sie diese nicht verwenden können. Leider löst die "Vorher" -Aussage nicht aus, welche Art von Änderung bevorsteht stattfinden, also glaube ich nicht, dass du diese auch benutzen kannst.

Basierend darauf würde ich sagen, dass es unwahrscheinlich ist, dass Sie diese Art von Schutz mit Triggern in die Datenbank einbauen können, es sei denn, Sie haben nichts dagegen, einen "after" -Auslöser zu verwenden und die Transaktion bei der Bedingung rückgängig zu machen ist nicht zufrieden. Würde nichts dagegen haben, sich als falsch erwiesen zu haben. :)

    
quelle
1

Sehen Sie sich die Verwendung von Serializable Isolation Level an. Ich glaube, dies wird Ihnen eine konsistente Sicht auf die Datenbankdaten innerhalb Ihrer Transaktion geben. Dann können Sie die Option 1, die MusiGenesis erwähnt, ohne die Timing-Schwachstelle verwenden. Testen Sie es natürlich, um es zu validieren.

    
Kuberchaun 01.04.2010 14:11
quelle
0

Ich habe noch nie mit postgresql gearbeitet, daher trifft meine Antwort möglicherweise nicht zu. In SQL Server kann Ihr Auslöser eine gespeicherte Prozedur aufrufen, die eines von zwei Dingen tun würde:

  1. Führen Sie SELECT COUNT (*) durch, um die Anzahl der Datensätze zu ermitteln, die von UPDATE betroffen sind, und führen Sie das UPDATE nur dann aus, wenn die Anzahl 4 oder weniger beträgt
  2. Führen Sie das UPDATE innerhalb einer Transaktion durch und geben Sie die Transaktion nur dann fest, wenn die zurückgegebene Anzahl der betroffenen Zeilen 4 oder weniger beträgt

Nein. 1 ist timing anfällig (die Anzahl der vom UPDATE betroffenen Datensätze kann sich zwischen der COUNT (*) - Prüfung und dem tatsächlichen UPDATE ändern. Nr. 2 ist ziemlich ineffizient, wenn es viele Fälle gibt, in denen die Anzahl der aktualisierten Zeilen größer als 4 ist.

    
MusiGenesis 01.04.2010 13:48
quelle

Tags und Links