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
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?
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. :)
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.
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:
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.
Tags und Links postgresql