PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Общ тригер за ограничаване на вмъкванията въз основа на броя

Правил съм подобен тип генерични тригери. Най-сложната част е да получа записа на стойността в NEW запис въз основа на името на колоната.

Правя го по следния начин:

  • конвертиране на NEW данни в масив;
  • намерете attnum на колоната и го използвайте като индекс за масива.

Този подход работи стига да няма запетаи в данните :( Не знам за други начини за конвертиране на NEW или OLD променливи в масива от стойности.

Следната функция може да помогне:

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;

Тази функция ще провери за всички условия, дефинирани за дадена таблица.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL планета в Ansible Galaxy

  2. RoR Група часови зони на Postgresql, като не работи на Heroku

  3. Django:Получавам грешка [релация auth_group не съществува] след syncdb

  4. PostqreSQL в Rails:Как да накарам сървъра да работи локално И да приема връзки в сокета на домейна на Unix?

  5. Сравняване на хранилища за данни за PostgreSQL - MVCC срещу InnoDB