На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Не срабатывают триггеры журнала изменений

Поиск  Пользователи  Правила  Войти
Форум » Серверные приложения » ГИС Сервер
Страницы: 1
RSS
Не срабатывают триггеры журнала изменений
 
Здравствуйте!

Не срабатывают триггеры журнала изменений.

Работа с СУБД ведется при помощи консольной утилиты psql. Данные в таблице меняю только DML командами. Таблица pgis2map_dbchanges_log пустая. Записи не появляются ни при INSERT, ни при DELETE.

Для настройки журнала изменений я применил log_table.sql из каталога /usr/gisserver/setupDB/postgres и указал информацию в dbm файле - <dblogname>public.pgis2map_dbchanges_log</dblogname>

Возможно нужны еще какие-либо настройки?
 
Цитата
Алексей написал:
Здравствуйте!

Не срабатывают триггеры журнала изменений.

Работа с СУБД ведется при помощи консольной утилиты 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 ИМЯ_ТРИГГЕРНОЙ_ФУНКЦИИ();

Пока в таблице журнала не начнут корректно регистрироваться изменения на уровне триггерной логики, грешить на настройки ГИС Сервера рано.
Страницы: 1
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности