PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wyzwalacz z dynamiczną nazwą pola

Możesz to dość wygodnie zaimplementować za pomocą hstore operator #= :

Upewnij się, że dodatkowy moduł jest poprawnie zainstalowany (raz na bazę danych), w schemacie zawartym w search_path :

  • Jak używać operatora % z rozszerzenia pg_trgm?
  • Najlepszy sposób na zainstalowanie hstore na wielu schematach w bazie danych Postgres?

Funkcja wyzwalania:

CREATE OR REPLACE FUNCTION tbl_insup_bef()
  RETURNS TRIGGER AS
$func$
DECLARE
   _prefix CONSTANT text := 'some prepend data'; -- your prefix here
   _prelen CONSTANT int  := 17;  -- length of above string (optional optimization)
   _col text := quote_ident(TG_ARGV[0]);
   _val text;
BEGIN
   EXECUTE 'SELECT $1.' || _col
   USING NEW
   INTO _val;

   IF left(_val, _prelen) = _prefix THEN 
      -- do nothing: prefix already there!
   ELSE
      NEW := NEW #= hstore(_col, _prefix || _val);  
   END IF;

   RETURN NEW;
END
$func$  LANGUAGE plpgsql;

Wyzwalacz (ponowne użycie tej samej funkcji dla wielu tabel):

CREATE TRIGGER insup_bef
BEFORE INSERT OR UPDATE ON tbl
FOR EACH ROW
EXECUTE PROCEDURE tbl_insup_bef('fieldName');  -- unquoted, case-sensitive column name

Ściśle powiązane z dodatkowymi wyjaśnieniami i poradami:

  • Przypisanie kolumny z dynamiczną nazwą kolumny
  • Jak uzyskać dostęp do NOWEGO lub STAREGO pola podając tylko nazwę pola?
  • Pobierz wartości z różnych kolumn w ogólnej regule


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zmienić schemat wielu tabel PostgreSQL w jednej operacji?

  2. PostgreSQL - Dodaj klucz do każdego obiektu tablicy JSONB

  3. Mieszanie sprzężeń jawnych i niejawnych kończy się niepowodzeniem z Istnieje wpis dla tabeli ... ale nie można się do niego odwoływać z tej części zapytania

  4. Wydajność TPC-H od PostgreSQL 8.3

  5. Jak działa justify_hours() w PostgreSQL