sql >> Database teknologi >  >> RDS >> PostgreSQL

Generisk trigger for at begrænse indsættelser baseret på antal

Jeg har lavet en lignende type generiske triggere. Den mest vanskelige del er at få værdiindtastningen i NEW post baseret på kolonnenavnet.

Jeg gør det på følgende måde:

  • konverter NEW data i array;
  • find attnum af kolonnen og brug den som et indeks for arrayet.

Denne tilgang virker så længe der ikke er kommaer i dataene :( Jeg kender ikke andre måder, hvordan man konverterer NEW eller OLD variabler ind i rækken af ​​værdier.

Følgende funktion kan måske hjælpe:

CREATE OR REPLACE FUNCTION impose_maximum() RETURNS trigger AS $impose_maximum$
DECLARE
  _sql  text;
  _cnt  int8;
  _vals text[];
  _anum int4;
  _im   record;

BEGIN
 _vals := string_to_array(translate(trim(NEW::text), '()', ''), ',');

 FOR _im IN SELECT * FROM imposed_maximums WHERE table_name = TG_TABLE_NAME LOOP
  SELECT attnum INTO _anum FROM pg_catalog.pg_attribute a
    JOIN pg_catalog.pg_class t ON t.oid = a.attrelid
   WHERE t.relkind = 'r' AND t.relname = TG_TABLE_NAME
     AND NOT a.attisdropped AND a.attname = _im.column_group;

  _sql := 'SELECT count('||quote_ident(_im.column_count)||')'||
          ' FROM '||quote_ident(_im.table_name)||
          ' WHERE '||quote_ident(_im.column_group)||' = $1';

  EXECUTE _sql INTO _cnt USING _vals[_anum];

  IF _cnt > CAST(_im.max_size AS int8) THEN
    RAISE EXCEPTION 'Maximum of % hit for column % in table %(%=%)',
      _im.max_size, _im.column_count,
      _im.table_name, _im.column_group, _vals[_anum];
  END IF;
 END LOOP;

 RETURN NEW;
END; $impose_maximum$ LANGUAGE plpgsql;

Denne funktion vil kontrollere for alle betingelser, der er defineret for en given tabel.



  1. MySQL-forespørgsel for at finde kunder, der har bestilt to specifikke produkter

  2. readyStatement-indstillingen null for NUMBER_ARRAY virker ikke

  3. Forespørgsel med brudt undervalg burde resultere i fejl, men returnerer rækker

  4. Laravel-migrering Kan ikke tilføje fremmednøglebegrænsningsfejl med MySQL-database