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

Pengalihan penyisipan berbasis pemicu Postgres tanpa merusak RETURNING

Satu-satunya solusi yang saya temukan, adalah membuat tampilan untuk tabel dasar &menggunakan INSTEAD OF pemicu pada tampilan itu:

CREATE TABLE flags_base (
    id integer NOT NULL,
    flaggable_type character varying(255) NOT NULL,
    flaggable_id integer NOT NULL,
    body text
);

ALTER TABLE ONLY flags_base
    ADD CONSTRAINT flags_base_pkey PRIMARY KEY (id);

CREATE TABLE "comment_flags" (
 CHECK ("flaggable_type" = 'Comment'),
 PRIMARY KEY ("id")
) INHERITS ("flags_base");

CREATE TABLE "profile_flags" (
 CHECK ("flaggable_type" = 'Profile'),
 PRIMARY KEY ("id")
) INHERITS ("flags_base");

CREATE OR REPLACE VIEW flags AS SELECT * FROM flags_base;

CREATE OR REPLACE FUNCTION flag_insert_trigger_fun() RETURNS TRIGGER AS $BODY$
BEGIN
  IF (NEW."flaggable_type" = 'Comment') THEN
    INSERT INTO comment_flags VALUES (NEW.*);
  ELSIF (NEW."flaggable_type" = 'Profile') THEN
    INSERT INTO profile_flags VALUES (NEW.*);
  ELSE
    RAISE EXCEPTION 'Wrong "flaggable_type"="%", fix flag_insert_trigger_fun() function', NEW."flaggable_type";
  END IF;
  RETURN NEW;
END; $BODY$ LANGUAGE plpgsql;

CREATE TRIGGER flag_insert_trigger
  INSTEAD OF INSERT ON flags
  FOR EACH ROW EXECUTE PROCEDURE flag_insert_trigger_fun();

Namun dengan cara ini Anda harus berikan id bidang pada setiap penyisipan (bahkan jika flags_base kunci utama memiliki nilai default / adalah serial), jadi Anda harus menyiapkan pemicu penyisipan untuk memperbaiki NEW.id jika itu adalah NULL .

PERBARUI :Tampaknya kolom tampilan juga dapat memiliki nilai default, atur dengan

ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] column_name SET DEFAULT expression

yang hanya digunakan dalam tampilan memiliki aturan/pemicu insert/update.

http://www.postgresql.org/docs/9.3/static/sql-alterview.html



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Lakukan kueri jam operasi ini di PostgreSQL

  2. Bagaimana cara mengembalikan array jsonb dan array objek dari data saya?

  3. Temukan baris di mana array teks berisi nilai yang mirip dengan input

  4. PostgreSQL salah mengonversi dari stempel waktu tanpa zona waktu ke stempel waktu dengan zona waktu

  5. Apakah ada cara untuk memuat data teks ke database di PostgreSQL?