sql >> Database >  >> RDS >> PostgreSQL

Postgres trigger-gebaseerde invoegomleiding zonder RETURNING te verbreken

De enige oplossing die ik heb gevonden, is om een ​​weergave voor de basistabel te maken en INSTEAD OF te gebruiken triggers op die weergave:

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

Maar op deze manier moet je moeten geef de id . op veld bij elke invoeging (zelfs als flags_base 's primaire sleutel heeft een standaardwaarde / is een serienummer), dus u moet uw insert-trigger voorbereiden om NEW.id te repareren als het een NULL . is .

UPDATE :Het lijkt erop dat de kolommen van views ook standaardwaarden kunnen hebben, ingesteld met

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

die alleen wordt gebruikt in weergaven hebben een invoeg-/bijwerkregel/trigger.

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



  1. Hoe STRCMP() werkt in MariaDB

  2. MySQL controleren of een tabel bestaat zonder een uitzondering te genereren

  3. Simulatie van CONNECT BY PRIOR van Oracle in SQL Server

  4. ASCII() Voorbeelden – MySQL