sql >> Databáze >  >> RDS >> PostgreSQL

Zlepšení funkce, kterou UPSERTs zakládá na vstupním poli

Máme spoustu různých serverů, které se tlačí do centrálních tabulek v Postgresu, což přidává další vrásku. Co když do tabulky přidám sloupec:

ALTER TABLE item ADD COLUMN category citext;

Nyní má tabulka čtyři sloupce místo tří.

Všechny mé stávající nabídky okamžitě přerušit, protože nyní ve vstupech chybí sloupec. Existuje 0% šance, že budeme moci aktualizovat všechny servery současně, takže to není žádná možnost.

Jedním z řešení je vytvořit vlastní typ pro každou verzi tabulky:

CREATE TYPE item_v1 AS (
    id uuid,
    marked_for_deletion boolean,
    name_ citext);

CREATE TYPE item_v2 AS (
    id uuid,
    marked_for_deletion boolean,
    name_ citext,
    category citext);

A pak funkce pro každý typ:

CREATE OR REPLACE FUNCTION data.item_insert_array (data_in item_v1[]) 
etc.

CREATE OR REPLACE FUNCTION data.item_insert_array (data_in item_v2[]) 
etc.

Myslím, že byste mohli mít jedinou geniální metodu, která vezme anyarray a používá CASE k vyřešení toho, jaký kód spustit. Z několika důvodů bych to neudělal, ale předpokládám, že byste mohli. (Viděl jsem, že se tento přístup stal gangrenózním ve více než jednom jazyce ve skutečném spěchu.)

Všechno to vypadá jako pořádná práce. Chybí mi nějaká jednodušší technika? Představuji si, že byste mohli odeslat strukturovaný text/XML/JSON, rozbalit jej a pracovat odtud. Ale nebudu soubor, který pod "jednodušší."

Samozřejmě stále pracuji na návrhu. Napsal jsem dostatek kódu, abych otestoval to, co jsem ukázal, ale než se vrátím a implementuji to na desítkách tabulek, chci vyřešit podrobnosti.

Děkujeme za jakoukoli pomoc.



  1. Uložená procedura T-SQL, která přijímá více hodnot ID

  2. Funkce NLS_CHARSET_ID() v Oracle

  3. PostgreSQL – Jak eliminovat opakované hodnoty

  4. Vnitřnosti WITH ENCRYPTION