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

Пренасочване на вмъкване, базирано на задействане на Postgres, без прекъсване на RETURNING

Единственото решение, което намерих, е да създам изглед за основната таблица и да използвам INSTEAD OF задейства в този изглед:

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();

Но по този начин виетрябвате предоставете id поле при всяко вмъкване (дори ако flags_base Първичният ключ на има стойност по подразбиране / е сериен), така че трябва да подготвите задействането си за вмъкване, за да коригирате NEW.id ако е NULL .

АКТУАЛИЗИРАНЕ :Изглежда, че колоните на изгледите също могат да имат стойности по подразбиране, зададени с

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

който се използва само в изгледи, има правило за вмъкване/актуализация/задействане.

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. Заявка за тип данни на Postgres JSON Rails

  2. няма запис pg_hba.conf за хост

  3. Съхранявайте резултата от заявката в променлива, използвана в PL/pgSQL

  4. Не може да се свърже с локалния PostgreSQL

  5. Използвайте двоична таблица COPY FROM с psycopg2