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

Bagaimana cara menyimpan data dengan koma dalam karakter yang bervariasi yang melewati pemicu?

Anda dapat menggunakan format() untuk membuat pembuatan kueri SQL dinamis lebih mudah karena secara otomatis akan menangani pengidentifikasi dan literal dengan benar. Satu hal yang biasanya diabaikan orang adalah Anda dapat memperluas satu ekspresi rekaman ke semua kolomnya menggunakan (...).* - ini juga berfungsi untuk NEW dan OLD merekam variabel dalam pemicu, mis. select (new).*

Anda juga dapat meneruskan variabel ke SQL dinamis dengan using kata kunci dari execute penyataan. Tidak perlu mengonversi rekaman bolak-balik antara rekaman dan representasi teks.

Menggunakan kemungkinan itu, fungsi pemicu Anda dapat disederhanakan menjadi:

DECLARE 
  l_sql text;
BEGIN
    IF TG_TABLE_SCHEMA = 'public' THEN
      newtable := TG_TABLE_NAME || '_actividad';
    ELSE
      newtable := TG_TABLE_SCHEMA || '_' || TG_TABLE_NAME || '_actividad';
    END IF;

    PERFORM creartablaactividad(TG_TABLE_SCHEMA, TG_TABLE_NAME);
    l_sql := 'INSERT INTO actividad.%I  SELECT current_user, current_timestamp, %L, ($1).*';

    IF TG_OP = 'DELETE' THEN
      execute format(l_sql, newtable, 'D') using OLD;
      RETURN OLD;
    ELSE
      -- covers UPDATE and INSERT
      execute format(l_sql, newtable, 'U') using NEW;
      RETURN NEW;
    END IF;

    RETURN NULL; -- result is ignored since this is an AFTER trigger
END;

Menggunakan placeholder seperti %I dan %L juga memungkinkan untuk mendefinisikan SQL aktual hanya sekali dan menggunakannya kembali. "Parameter" tersebut diganti dengan format() fungsi (yang mempertahankan $1 )

Perhatikan penggunaan ($1).* di dalam string SQL. Itu akan membuat execute pernyataan memperluas parameter record $1 ke semua kolomnya. Catatan itu sendiri diteruskan "asli" dengan USING kata kunci.

Penggunaan INSERT tanpa daftar kolom target (insert into some_table ... alih-alih insert into some_table (col1, col2, ...) ... ) adalah hal yang cukup rapuh untuk dilakukan. Jika sumber dan target tidak cocok, sisipan bisa gagal dengan mudah. .

Jika Anda tidak menjalankan pelaporan besar-besaran pada tabel audit (di mana memiliki nama kolom eksplisit akan jauh lebih efisien), Anda mungkin ingin memikirkan pemicu audit yang lebih umum menggunakan JSON atau HSTORE kolom untuk menyimpan seluruh record. Ada beberapa pemicu audit siap pakai yang tersedia:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Fungsi PostgreSQL yang ditentukan pengguna dalam dialek hibernasi melempar pengecualian

  2. Keluarkan ya/tidak sebagai ganti t/f untuk tipe data boolean di PostgreSQL

  3. Cara menginstal Gnatcoll Postgres di Linux Centos 7

  4. Apa urutan default dari daftar yang dikembalikan dari panggilan filter Django?

  5. Pengantar PostgreSQL