2

ユーザーメンバーシップがあり、postgresqlを使用するシステムがあります。現在、postgresqlユーザーアプリケーションで使用されているのと同じユーザー資格情報を使用する別のミニeコマースアプリケーションに取り組んでいます。新しいユーザーがpostgresqlユーザーアプリにサインアップすると、postgresからeコマースサイトへのデータが自動的に更新されます。

注意:2つの異なるアプリケーションに2つの異なるデータベースを使用しますが、両方のアプリで同じユーザーテーブルを使用します。eコマースアプリへの登録や登録はありません。オリジナル(メインデータベース)は確かにpostgresql 8.4ですが、他の1つはmysqlまたは同様のpostgresqlである可能性があります。これは、eコマースアプリがphpであるのに対し、メインアプリはgrails(java)であるためです。

4

1 に答える 1

2

最初の明白な解決策は、両方のサーバーが postgres であると仮定してdblinkを使用することです。

ただし、独自の部分複製デーモンを作成することはできます。以下に、テーブルユーザーを SQLite データベースに複製する簡単な例を示します。

postgres usersdbデータベースにテーブルusersがあります。

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

ユーザーのログ テーブルを作成します。

create table users_log (
    id serial primary key,
    action text);

テーブルusersでトリガーを作成します。

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 データベースusers.dbとその中に users.db テーブルを作成します。

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

デーモン スクリプトは、users_log を 2 秒ごとにチェックします。新しいアクションがある場合、スクリプトはそれらを SQlite データベースで 1 つずつ作成し、users_log から削除します。

<?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]");
    }
}
?>

簡単にするために、スクリプトは完全に最小限のものであり、必要な例外処理を装備する必要があります。

于 2013-02-08T12:31:40.233 に答える