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

Transaksi Rollback pada Trigger ERROR

Beberapa masalah dengan fungsi pemicu Anda:

  • Gunakan IF EXISTS (...) THEN bukannya menghitung semua kejadian. Lebih cepat, lebih sederhana. Lihat:

  • Fungsi pemicu AFTER INSERT OR UPDATE hanya dapat mengembalikan NULL . RETURN NEW hanya relevan untuk pemicu yang disebut BEFORE . Manual :

  • Kutipan tunggal tidak seimbang.

  • Seperti @Pavel menjelaskan , Anda tidak dapat mengontrol transaksi dari dalam fungsi plpgsql. Pengecualian yang tidak tertangani memaksa seluruh transaksi Anda dibatalkan secara otomatis. Jadi, hapus saja EXCEPTION blokir.

Pemicu hipotetis Anda ditulis ulang:

CREATE OR REPLACE FUNCTION check_room()
  RETURNS TRIGGER AS
$func$
BEGIN
   IF EXISTS (
         SELECT FROM "Sesion"    -- are you sure it's not "Session"?
         WHERE  "Room_Name" = NEW."Room_Name"
         AND    "Date" = NEW."Date") THEN
     RAISE EXCEPTION 'The room is rented at that date';
   END IF;
   RETURN NULL;
END
$func$  LANGUAGE plpgsql;

A BEFORE pemicu lebih masuk akal.

Tapi a UNIQUE INDEX ON ("Room_Name", "Date") akan melakukan hal yang sama, lebih efisien. Kemudian, setiap baris yang melanggar memunculkan pengecualian kunci duplikat dan mengembalikan transaksi (kecuali tertangkap dan ditangani). Di Postgres modern, Anda dapat melewatkan atau mengalihkan INSERT seperti itu upaya dengan INSERT ... ON CONFLICT ... . Lihat:

Penggunaan lanjutan:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Masalah pembuatan Pemicu PostgreSQL

  2. sambungkan instance postgres google cloud sql dari beam pipeline

  3. Tidak dapat terhubung ke dua database postgres di Rails 3.2.

  4. Postgresql :Menggabungkan 2 database serupa

  5. Bagaimana cara mengimpor baris ke Postgresql dari STDIN?