Ich verwende "klassische" zeitbasierte Partitionierung mit Triggern. Ich habe festgestellt, dass ein separater Trigger erforderlich ist, der auf der Originaltabelle ausgeführt wird.
CREATE TABLE twitter_interactions(...);
CREATE OR REPLACE FUNCTION insert_twitter_interactions ...;
CREATE TRIGGER insert_twitter_interactions_trig
BEFORE INSERT OR UPDATE on twitter_interactions
FOR EACH ROW EXECUTE PROCEDURE insert_twitter_interactions();
CREATE OR REPLACE FUNCTION maintain_data_pointers ...;
CREATE TRIGGER maintain_data_pointers_trig
BEFORE INSERT OR UPDATE on twitter_interactions
FOR EACH ROW EXECUTE PROCEDURE insert_twitter_interactions();
Ich habe nicht vollständig überprüft, aber ich vermute, dass die Partitionierungslogik vor dem Auslöser für die Wartung ausgeführt wird. Da die Zeile nicht in der übergeordneten Tabelle landet, wird der zweite Auslöser nie ausgelöst.
Was passiert, wenn ich auch eine ausführen möchte AFTER INSERT OR UPDATE
? Da die Zeile es nicht in die ursprüngliche Tabelle schafft, kann ich die After-Logik nicht implementieren.
quelle
RETURN NULL
. Sie können auch mehr Programmcode in dieselbe Triggerfunktion einfügen.PostgreSQL führt die Trigger in alphabetischer Reihenfolge nach Namen aus. Stellen Sie also sicher, dass Sie Namen verwenden, die sie in der gewünschten Reihenfolge erhalten. Aus den Dokumenten
Übrigens erstellt Ihr SQL zweimal denselben Trigger.
quelle