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

Ogólny wyzwalacz do ograniczania wstawiania na podstawie liczby

Robiłem podobny rodzaj ogólnych wyzwalaczy. Najtrudniejszą częścią jest uzyskanie wpisu wartości w NEW rekord na podstawie nazwy kolumny.

Robię to w następujący sposób:

  • przekonwertuj NEW dane do tablicy;
  • znajdź attnum kolumny i użyj jej jako indeksu tablicy.

To podejście działa o ile w danych nie ma przecinków :( Nie znam innych sposobów konwersji NEW lub OLD zmienne do tablicy wartości.

Pomocna może być następująca funkcja:

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;

Ta funkcja sprawdzi wszystkie warunki zdefiniowane dla danej tabeli.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. czy instrukcja sql zapewnia atomowość w postgresie?

  2. SQL wybierz elementy, w których suma pola jest mniejsza niż N

  3. W jaki sposób podejmowane są decyzje dotyczące skanowania sterty bitmapowej i skanowania indeksu?

  4. jak rozpakować połączenie PostgreSQL z IBM WSJdbc41Connection

  5. Zapytanie Postgres SQL do podsumowania danych o błędach