Mam wiele tabel, które korzystają z funkcji "Partycjonowanie" PostgreSQL. Chcę zdefiniować typowy wyzwalacz PRZED WSTAWIENIEM RZECZY na każdej tabeli, która 1) dynamicznie utworzy partycję, jeśli wstawienie wystąpi względem tabeli nadrzędnej i 2) ponownie uruchomi wstawkę względem partycji.Wstawianie NEW. * Z ogólnego wyzwalacza przy użyciu EXECUTE w PL/pgsql
Coś jak:
CREATE OR REPLACE FUNCTION partition_insert_redirect()
RETURNS trigger AS $BODY$
BEGIN
... create the new partition and set up the redirect Rules ...
/* Redo the INSERT dynamically. The new RULE will redirect it to the child table */
EXECUTE 'INSERT INTO ' || quote_ident(TG_TABLE_SCHEMA) || '.' || quote_ident(TG_TABLE_NAME) ||
' SELECT NEW.*'
END
Ale "nowy" rekord nie jest widoczny wewnątrz SQL EXECUTE. Jak mogę to zrobić tak prostym sposobem, jak to tylko możliwe?
W jaki sposób mogę ewentualnie powtórzyć pola w NOWYM rekordzie?
Myślałem o użyciu temp-table:
EXECUTE 'CREATE TEMPORARY TABLE new_row (LIKE ' ||
quote_ident(TG_TABLE_SCHEMA) || '.' || quote_ident(TG_TABLE_NAME) ||
') ON COMMIT DROP';
INSERT INTO new_row SELECT NEW.*;
EXECUTE 'INSERT INTO ' || quote_ident(TG_TABLE_SCHEMA) || '.' || quote_ident(TG_TABLE_NAME) ||
' SELECT * FROM new_row';
DROP TABLE new_row;
Ale to też nie działa ze względu na odniesienie do pamięci podręcznej Temp-tabela: Why do I get "relation with OID ##### does not exist" errors when accessing temporary tables in PL/PgSQL functions?
używam PostgreSQL 8.2 i nie mogę zmienić żadnej innej wersji.
EDIT:
Jak @alvherre zauważył, to prawdopodobnie można zrobić w PostgreSQL 8.4 ze składnią EXECUTE ... korzystają. Zobacz przykład pod adresem http://wiki.postgresql.org/wiki/PL/pgSQL_Dynamic_Triggers
Related później pytanie roztworem dla PostgreSQL 8.2: http: // stackoverflow. com/q/7519044/939860 –
@ErwinBrandstetter: Twoje rozwiązanie w pokrewnym pytaniu jest podobne do rozwiązania tego problemu w mojej odpowiedzi poniżej, ale w tym przypadku funkcja musi zostać przekompilowana za każdym razem, gdy nowa partycja zostanie dodana do tabeli lub w przeciwnym razie funkcja nie będzie świadoma zaktualizowanych reguł partycji. –