PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Pemicu umum untuk membatasi penyisipan berdasarkan jumlah

Saya telah melakukan jenis pemicu generik yang serupa. Bagian yang paling sulit adalah mendapatkan entri nilai di NEW record berdasarkan nama kolom.

Saya melakukannya dengan cara berikut:

  • konversi NEW data ke dalam larik;
  • temukan attnum kolom dan menggunakannya sebagai indeks untuk larik.

Pendekatan ini berfungsi selama tidak ada koma dalam data :( Saya tidak tahu cara lain bagaimana mengonversi NEW atau OLD variabel ke dalam array nilai.

Fungsi berikut mungkin membantu:

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;

Fungsi ini akan memeriksa semua kondisi yang ditentukan untuk tabel tertentu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perl + PostgreSQL-- Kolom Selektif ke Baris Transpose

  2. Lupa Password Admin di Postgres (Instalasi Windows), tidak bisa reset

  3. Tidak dapat terhubung ke postgres dari host jarak jauh

  4. Tandai rentang tanggal yang tidak bersebelahan

  5. Kueri SQL kompleks dengan banyak tabel dan relasi