Цитата |
---|
Алексей написал: Здравствуйте!
Не срабатывают триггеры журнала изменений.
Работа с СУБД ведется при помощи консольной утилиты psql. Данные в таблице меняю только DML командами. Таблица pgis2map_dbchanges_log пустая. Записи не появляются ни при INSERT, ни при DELETE.
Для настройки журнала изменений я применил log_table.sql из каталога /usr/gisserver/setupDB/postgres и указал информацию в dbm файле - <dblogname>public.pgis2map_dbchanges_log</dblogname>
Возможно нужны еще какие-либо настройки? |
Скрипт log_table.sql в инсталляции приложен для удобства создания журнала и необходимых триггеров.
Он выполняет создание таблицы журнала, а также добавляет триггеры для отслеживания изменений в таблицах с пространственными данными. Делает он это по списку, получаемому по sql-запросу к системным таблицам, в котором запрашиваются пользовательские таблицы, имеющие первичный ключ и поле метрики формата geometry.
Вот этот запрос:
sel ect f.table_schema, f.table_name, f.column_name
fr om information_schema.TABLE_CONSTRAINTS c
inner join information_schema.CONSTRAINT_COLUMN_USAGE f
on f.constraint_schema = c.constraint_schema and
f.table_name = c.table_name and
f.constraint_name = c.constraint_name
inner join information_schema.columns g
on f.constraint_schema = g.table_schema and
f.table_name = g.table_name and g.udt_name = 'geometry'
and c.constraint_type='PRIMARY KEY'
Если Вашей таблицы в результате этого запроса нет, триггер отслеживания изменений на ней создан не будет.
Это означает, что Ваша таблица не соответствует основному требованию по наличию минимум двух полей — первичного ключа и поля типа geometry, либо она некорректно зарегистрирована в опрашиваемых скриптом системных таблицах.
Могут быть и другие специфические причины, почему не создан триггер. Надо смотреть результат выполнения запроса. В разный ОС на разных версиях PostgreSQL и PostGIS могут быть разные нюансы.
В любом случае (цитата из readme.txt рядом с log_table.sql):
- скрипт считается выполненным успешно, если на таблицах,
имеющих поля пространственных данных созданы триггеры
trigger_pgis2map_dbchanges_log_insert, а также создана
таблица журнала изменений pgis2map_dbchanges_log.
Если записи в журнал не попадают, значит что-то не так с триггерами.
Если прилагаемый скрипт не смог по какой-то причине в автоматическом режиме создать триггер на Вашей таблице (и при этом таблица журнала есть, на ней, кстати, тоже должен быть триггер trigger_pgis2map_dbchanges_log_insert), то можно попробовать создать триггер на Вашей таблице самостоятельно.
Триггер должен срабатывать на операции изменения данных — INSERT, UPDATE и DELETE и вызывать триггерную функцию следующего содержания:
CREATE OR REPLACE FUNCTION ИМЯ_ТРИГГЕРНОЙ_ФУНКЦИИ()
RETURNS trigger AS
$BODY$BEGIN
IF (TG_OP = 'DELETE')
THEN
INS ERT INTO pgis2map_dbchanges_log(schemaname, tablename, idrecord, changestype)
SELECT TG_TABLE_SCHEMA, TG_TABLE_NAME, OLD."gid", 3; -- «gid» — это имя поля PK
ELSIF (TG_OP = 'UPDATE')
THEN
INS ERT IN TO pgis2map_dbchanges_log(schemaname, tablename, idrecord, changestype)
SELECT TG_TABLE_SCHEMA, TG_TABLE_NAME, NEW."gid", 2; -- «gid» — это имя поля PK
ELSIF (TG_OP = 'INSERT')
THEN
INS ERT IN TO pgis2map_dbchanges_log(schemaname, tablename, idrecord, changestype)
SELE CT TG_TABLE_SCHEMA, TG_TABLE_NAME, NEW."gid", 1; -- «gid» — это имя поля PK
END IF;
RETURN NULL; -- result is ignored since this is an AFTER trigger
END;
$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER
COST 100;
ALT ER FUNCTION ИМЯ_ТРИГГЕРНОЙ_ФУНКЦИИ()
OWNER TO postgres;
Триггер:
CREATE TRIGGER ИМЯ_ТРИГГЕРА
AFTER INSERT OR UPDATE OR DELETE
ON ВАША_ТАБЛИЦА
FOR EACH ROW
EXECUTE PROCEDURE ИМЯ_ТРИГГЕРНОЙ_ФУНКЦИИ();
Пока в таблице журнала не начнут корректно регистрироваться изменения на уровне триггерной логики, грешить на настройки ГИС Сервера рано.