PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Przekierowanie wstawiania oparte na wyzwalaczu Postgres bez przerywania RETURNING

Jedynym obejściem, jakie znalazłem, jest utworzenie widoku dla tabeli bazowej i użycie INSTEAD OF wyzwalacze w tym widoku:

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

Ale w ten sposób musisz podaj id pole przy każdym wstawieniu (nawet jeśli flags_base klucz podstawowy ma wartość domyślną / jest numerem seryjnym), więc musisz przygotować wyzwalacz wstawiania, aby naprawić NEW.id jeśli jest to NULL .

AKTUALIZUJ :Wygląda na to, że kolumny widoków również mogą mieć wartości domyślne, ustawiane za pomocą

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

który jest używany tylko w widokach, ma regułę/wyzwalacz wstawiania/aktualizowania.

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. Docker czeka na uruchomienie postgresql

  2. Jak działają widoki bariery bezpieczeństwa PostgreSQL?

  3. Jak korzystać z modelu uczenia maszynowego KNN z 2UDA – PostgreSQL i Orange (Część 1)

  4. Jak uzyskać dostęp do wewnętrznego indeksu tablicy za pomocą postgreSQL?

  5. Jak sprawić, by PyPy, Django i PostgreSQL współpracowały ze sobą?