Синхронизация таблиц из разных БД.

Здравствуйте друзья. Не без вашей помощи написал триггер на синхронизацию таблиц в двух разных базах данных.

CREATE OR REPLACE FUNCTION dorojnaya_set1_update()
  RETURNS TRIGGER AS
$BODY$
   BEGIN 
         perform dblink_connect('hostaddr=***.***.**.*** port=5432 dbname=***** user=alimuradov password=******');
	 perform dblink_exec(format('insert into dorojnaya_set (id, the_geom, objectcode, objectkey, objectid) values (%s, CAST(%L AS geometry), %L, %L, %L)', new.id, new.the_geom, new.objectcode, new.objectkey, new.objectid));	 	
         perform dblink_disconnect(); 
       RETURN NEW;
   END;
$BODY$

Но триггер переносит только вновь создаваемые объекты. При удалении объектов я так понимаю надо будет писать новый триггер, который будет срабатывать на delete.

Мне даже в голову не приходит базовый синтаксис, дайте наводящие мысли пожалуйста.

Вроде бы надо только поправить кусок кода
perform dblink_exec(format('insert into dorojnaya_set (id, the_geom, objectcode, objectkey, objectid) values (%s, CAST(%L AS geometry), %L, %L, %L)', new.id, new.the_geom, new.objectcode, new.objectkey, new.objectid));

Просто заменить в нем insert на delete и old на new?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Я пытаюсь удалить, все поля

Я пытаюсь удалить, все поля таблицы id которой совпадаю с id синхронизируемой таблицы. По идее запрос ниже должен был работать.

perform dblink_exec(format('delete  from dorojnaya_set where dorojnaya_set.id = OLD.id', OLD.id, OLD.the_geom, OLD.objectcode, OLD.objectkey, OLD.objectid));          

Но у меня выдается ошибка

Ошибки источника:
Ошибка PostGIS при удалении объектов: ОШИБКА: таблица "old" отсутствует в предложении FROM
КОНТЕКСТ: Error occurred ON dblink connection named "unnamed": could NOT execute command.
SQL-оператор: "SELECT dblink_exec(format('delete from dorojnaya_set where dorojnaya_set.id = OLD.id', OLD.id, OLD.the_geom, OLD.objectcode, OLD.objectkey, OLD.objectid))"
функция PL/pgSQL dorojnaya_set_delete_new(), строка 4, оператор PERFORM

Видимо не правильно задал

Видимо не правильно задал вопрос.

Есть две базы данных в пределах одного сервера.

БД1 и БД2.
БД2 является почти полной копией БД1. За исключением лишь того, что она содержит в таблицах меньшее количество столбцов.
Необходимо записывать изменения производимые в БД1 в БД2. Делаю все на триггерах.

Триггер на удаление у меня выглядит так

CREATE OR REPLACE FUNCTION dorojnaya_set_delete()
  RETURNS TRIGGER AS
$BODY$
   BEGIN 
         perform dblink_connect('hostaddr=******* port=5432 dbname=******* user=******** password=*******');
	 perform dblink_exec(format('delete from dorojnaya_set where dorojnaya_set.id = %s', OLD.id));
         perform dblink_disconnect(); 
       RETURN OLD;
   END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION dorojnaya_set_delete()
  OWNER TO gisgroup;

Триггер на добавление записи имеет вид.

CREATE OR REPLACE FUNCTION dorojnaya_set_insert()
  RETURNS TRIGGER AS
$BODY$
   BEGIN 
         perform dblink_connect('hostaddr=******* port=5432 dbname=******* user=******* password=*******');
	 perform dblink_exec(format('insert into dorojnaya_set (id, the_geom, objectcode, objectkey, objectid) values (%s, CAST(%L AS geometry), %L, %L, %L)', new.id, new.the_geom, new.objectcode, new.objectkey, new.objectid));	 	
         perform dblink_disconnect(); 
       RETURN NEW;
   END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION dorojnaya_set_insert()
  OWNER TO gisgroup;

Возникли проблемы с написанием триггера на обновление, который будет сохранять изменения вносимые в БД1 в БД2.
Написал триггер но он не производит обновление записей. Помогите пожалуйста разобраться.

Как вариант написал вот

Как вариант написал вот так

CREATE OR REPLACE FUNCTION dorojnaya_set_update()
  RETURNS TRIGGER AS
$BODY$
   BEGIN 
         perform dblink_connect('hostaddr=****** port=5432 dbname=***** user=***** password=*****');
	 perform dblink_exec(format('UPDATE dorojnaya_set SET id=%s, the_geom=CAST(%L AS geometry), objectcode=%L, objectkey=%L, objectid=%L', new.id, new.the_geom, new.objectcode, new.objectkey, new.objectid));	 	
         perform dblink_disconnect(); 
       RETURN NEW;
   END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION dorojnaya_set_update()
  OWNER TO gisgroup;

но при обновлении полей выдается ошибка

Ошибки источника:
Ошибка PostGIS при изменении атрибутов: ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности "dorojnaya_set_pkey"
ПОДРОБНОСТИ: Ключ "(id)=(2612)" уже существует.
КОНТЕКСТ: Error occurred on dblink connection named "unnamed": could not execute command.
SQL-оператор: "SELECT dblink_exec(format('UPDATE dorojnaya_set SET id=%s, the_geom=CAST(%L AS geometry), objectcode=%L, objectkey=%L, objectid=%L', new.id, new.the_geom, new.objectcode, new.objectkey, new.objectid))"
функция PL/pgSQL dorojnaya_set_update(), строка 4, оператор PERFORM

А что вы хотите собственно?

А что вы хотите собственно? Синтаксис оператора UPDATE подразумевает указание предложения WHERE если вы хотите изменить ОДНУ или НЕСКОЛЬКО записей согласно предложению WHERE. А вы пытаетесь все значения в таблице обновить.

но мне так и надо, не буду же

но мне так и надо, не буду же я все поля, а их около 50 перечислять в where

Для того, чтобы

Для того, чтобы идентифицировать запись нужно всего одно поле - первичный ключ

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023