PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

रिटर्निंग को तोड़े बिना ट्रिगर-आधारित इंसर्ट रीडायरेक्शन पोस्टग्रेज करता है

एकमात्र समाधान जो मैंने पाया, वह है आधार तालिका के लिए एक दृश्य बनाना और 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. स्प्रिंग बूट में पोस्टग्रेज कनेक्शन बंद कर दिया गया है त्रुटि

  2. Slony-I में स्विचओवर/स्विचबैक PostgreSQL के प्रमुख संस्करणों को अपग्रेड करते समय 8.4.x/9.3.x

  3. तालिका विदेशी कुंजियों को कैसे सूचीबद्ध करें

  4. PostgreSQL में कनेक्शन प्रबंधन:एक गाइड

  5. एक गतिशील क्रॉसस्टैब क्वेरी निष्पादित करें