PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Chuyển hướng chèn dựa trên trình kích hoạt Postgres mà không phá vỡ RETURNING

Cách giải quyết duy nhất mà tôi tìm thấy, là tạo một dạng xem cho bảng cơ sở và sử dụng INSTEAD OF kích hoạt trên chế độ xem đó:

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

Nhưng theo cách này, bạn phải cung cấp id trường trên mỗi lần chèn (ngay cả khi flags_base khóa chính của có giá trị mặc định / là một nối tiếp), vì vậy bạn phải chuẩn bị trình kích hoạt chèn của mình để sửa NEW.id nếu nó là NULL .

CẬP NHẬT :Có vẻ như các cột của chế độ xem cũng có thể có giá trị mặc định, được đặt bằng

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

chỉ được sử dụng trong các dạng xem có quy tắc / trình kích hoạt chèn / cập nhật.

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. Thêm 'nối tiếp' vào cột hiện có trong Postgres

  2. cron job để xóa dữ liệu cũ khỏi postgres trên debian

  3. Tôi làm cách nào để ghi nhật ký psycopg2 về thời gian thực hiện truy vấn?

  4. Cách hoạt động của hàm Ln () trong PostgreSQL

  5. Trả về danh sách được nhóm lại với các lần xuất hiện bằng Rails và PostgreSQL