Здравствуйте друзья. Не без вашей помощи написал триггер на синхронизацию таблиц в двух разных базах данных.
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));
Но у меня выдается ошибка
Видимо не правильно задал
Видимо не правильно задал вопрос.
Есть две базы данных в пределах одного сервера.
БД1 и БД2.
БД2 является почти полной копией БД1. За исключением лишь того, что она содержит в таблицах меньшее количество столбцов.
Необходимо записывать изменения производимые в БД1 в БД2. Делаю все на триггерах.
Триггер на удаление у меня выглядит так
Триггер на добавление записи имеет вид.
Возникли проблемы с написанием триггера на обновление, который будет сохранять изменения вносимые в БД1 в БД2.
Написал триггер но он не производит обновление записей. Помогите пожалуйста разобраться.
Как вариант написал вот
Как вариант написал вот так
но при обновлении полей выдается ошибка
Ошибки источника:
Ошибка 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
Для того, чтобы
Для того, чтобы идентифицировать запись нужно всего одно поле - первичный ключ