插入后同步两个表
sync two tables after insert
我正在使用 postgresql。我有两个模式 main
和 sec
只包含一个具有相同结构的 table datastore
(这只是一个摘录)
当插入发生在其中一个时,我试图创建一个触发器以保持两个 table 同步,但没有成功。问题是某种循环或递归引用。
你能创建一些例子来解决这个问题吗?
我正在处理这个问题,稍后我会 post 我的解决方案。
您可以使用此代码作为创建模式和 tables
的参考
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
);
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();`
可更新的视图是最好的解决方案,并且与 (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上的触发器应该类比定义。
我正在使用 postgresql。我有两个模式 main
和 sec
只包含一个具有相同结构的 table datastore
(这只是一个摘录)
当插入发生在其中一个时,我试图创建一个触发器以保持两个 table 同步,但没有成功。问题是某种循环或递归引用。
你能创建一些例子来解决这个问题吗?
我正在处理这个问题,稍后我会 post 我的解决方案。 您可以使用此代码作为创建模式和 tables
的参考 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
);
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();`
可更新的视图是最好的解决方案,并且与 (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上的触发器应该类比定义。