插入

时间:2015-09-23 22:37:21

标签: postgresql triggers insert synchronization postgresql-9.3

我正在使用postgresql。我有两个模式mainsec只包含一个具有相同结构的表datastore(这只是一个提取) 我正在尝试创建一个触发器,以便在其中一个表中插入时保持同步两个表。问题是某种循环或递归参考。

你能创建一些解决这个问题的例子吗?

我正在研究这个问题,我稍后会发布我的解决方案。 您可以使用此代码作为创建模式和表的参考

    CREATE SCHEMA main;
    CREATE SCHEMA sec;
    SET search_path = main, pg_catalog;
    CREATE TABLE datastore (
        fullname character varying,
        age integer
    );
    SET search_path = sec, pg_catalog;
    CREATE TABLE datastore (
        fullname character varying,
        age integer
    );

2 个答案:

答案 0 :(得分:3)

可更新视图是最佳解决方案,就像(Postgres 9.3 +)一样简单:

drop table sec.datastore;
create view sec.datastore
as select * from main.datastore;

但是,如果由于某些不可理喻的原因而无法执行此操作,请使用pg_trigger_depth()函数(Postgres 9.2+)以确保在复制期间不执行触发器功能。 main.datastore上的触发器可能如下所示:

create or replace function main.datastore_insert_trigger()
returns trigger language plpgsql as $$
begin
    insert into sec.datastore
    select new.fullname, new.age;
    return new;
end $$;

create trigger datastore_insert_trigger
before insert on main.datastore
for each row when (pg_trigger_depth() = 0)
execute procedure main.datastore_insert_trigger();

应该类似地定义sec.datastore上的触发器。

答案 1 :(得分:0)

create OR REPLACE function copytosec() RETURNS TRIGGER AS $$
BEGIN
insert into sec.datastore(fullname,age) values (NEW.fullname,NEW.age); 
RETURN NEW; 
END;
$$ LANGUAGE plpgsql;

create trigger copytosectrigger after insert on public.datastore 
for each row 
execute procedure copytosec();`