我有一个拥有用户成员资格并使用postgresql的系统,现在我正在开发另一个小型电子商务应用程序,它将使用postgresql用户应用程序上使用的相同用户凭据。当新用户注册PostgreSQL用户应用程序时,从Postgres到电子商务网站的数据将自动更新。
请注意:将为两个不同的数据库使用两个不同的
应用程序,但两个应用程序上的用户表相同。不会有任何迹象
在电子商务应用程序上注册或注册。
原来的(主数据库)肯定是PostgreSQL 8.4,但另一个可能是MySQL或类似的PostgreSQL还没有真正决定,因为电子商务应用可能在PHP中,而主应用在Grails(Java)中。

最佳答案

第一个和obvoius解决方案是使用dblink假设两个服务器都是postgres。
但是,您可以编写自己的部分复制守护进程。下面是一个将表用户复制到sqlite数据库的简单示例。
postgres usersdb数据库中有表用户:

create table users (
    id serial primary key,
    name text);

为用户创建日志表:
create table users_log (
    id serial primary key,
    action text);

在表用户上创建触发器:
create or replace function users_trigger ()
returns trigger language plpgsql as $$
declare
    newaction text;
begin
    if (TG_OP = 'UPDATE') then
        newaction:= 'update users set
        name = '''||new.name||''' where id = '||old.id::text;
    elsif (TG_OP = 'INSERT') then
        newaction:= 'insert into users values
        ('||new.id::text||', '''||new.name||''')';
    elsif (TG_OP = 'DELETE') then
        newaction:= 'delete from users where id = '||old.id::text;
    end if;
    insert into users_log (action) values (newaction);
    return null;
end; $$;

create trigger users_trigger
  after insert or update or delete
  on users
  for each row
  execute procedure users_trigger();

在其中创建sqlite3 database users.db和表用户:
create table users (
    id integer primary key,
    name text);

守护程序脚本每2秒检查一次用户日志。如果有新操作,则脚本会在sqlite数据库中逐个执行,并从用户日志中删除:
<?php
$postgres = new PDO('pgsql:host=localhost port=5432 dbname=usersdb');
$sqlite = new PDO('sqlite:users.db');

$sql = 'select * from users_log order by id limit 1';
while (true) {
    sleep(2);
    while ($row = $postgres->query($sql)->fetch()) {
        $sqlite->query($row[1]);
        echo $row[1]. "\n";
        $postgres->query("delete from users_log where id = $row[0]");
    }
}
?>

为了简单起见,该脚本是绝对最低限度的,应该配备必要的异常处理。

10-06 12:58
查看更多