简体   繁体   中英

PostgreSQL trigger to replicate changes from one table to another

I have a database named info. In the database I have 4 different tables info1 , info2 , info3 and info4 .

I want to create a stored procedure so that whenever I make changes in table info1 (like INSERT , DELETE or UPDATE ) the same changes should appear in the other three tables.

I am using PostgreSQL for this and I don't know how to perform this query.

Please explain it with an example.

Thanks in advance!

Basically you need to read the manual to understand what you are doing. @Michael provided links.

There are many different ways how you can go about this. Here are two typical examples for UPDATE and DELETE :

Create trigger function for UPDATE:

CREATE OR REPLACE FUNCTION trg_info1_upaft()
  RETURNS trigger AS
$BODY$
BEGIN
    UPDATE info2
    SET col1 = NEW.col1
    --more?
    WHERE info2.info1_id = NEW.info1_id;

    UPDATE info3
    SET col1 = NEW.col1
    --more?
    WHERE info3.info1_id = NEW.info1_id;

    -- more?
    RETURN NULL; -- because trigger is meant for AFTER UPDATE
END;
$BODY$
  LANGUAGE plpgsql;

Create the trigger making use of it:

CREATE TRIGGER upaft
  AFTER UPDATE
  ON info1
  FOR EACH ROW
  EXECUTE PROCEDURE trg_info1_upaft();

For DELETE:

CREATE OR REPLACE FUNCTION trg_info1_delaft()
  RETURNS trigger AS
$BODY$
BEGIN
    DELETE FROM info2
    WHERE info1_id = OLD.info1_id;

    -- more?
    RETURN NULL; -- because trigger is meant for AFTER DELETE
END;
$BODY$
  LANGUAGE plpgsql;

CREATE TRIGGER delaft
  AFTER DELETE
  ON info1
  FOR EACH ROW
  EXECUTE PROCEDURE trg_info1_delaft();

For such changes you should use trigger: http://www.postgresql.org/docs/current/interactive/triggers.html

You will have to create function that inserts/updates/deletes new data into other tables and then show PostgreSQL with CREATE TRIGGER http://www.postgresql.org/docs/current/interactive/sql-createtrigger.html to call that function every time data in source table is changed.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM