Страница 1 из 1
Настройка postgis (автоматическое заполнения пользователя и даты создания)
Добавлено: 24 дек 2018, 18:47
Dezmond
Добрый вечер, коллеги!
Воспользовавшись мануалом
http://gis-lab.info/qa/postgis-work.html я создал базу данных (postgres), загрузил слои, создал пользователей и раздал права. В принципе база полноценно работает, но хочется докрутить несколько важных функций. Серф в интернете быстрого ответа не дал, поэтому решил обратиться к сообществу.
Необходимо сделать автоматическое заполнение поля "person" - пользователь кто добавил/отредактировал объект и поля "date" - дата и время создания/редактирования объекта.
Я так понимаю нужно заполнить Trigger Function для каждой задачи.
Подскажите пожалуйста, что в них писать?
П.С. Спасибо за помощь
Re: Настройка postgis (автоматическое заполнения пользователя и даты создания)
Добавлено: 24 дек 2018, 19:30
trir
Re: Настройка postgis (автоматическое заполнения пользователя и даты создания)
Добавлено: 24 дек 2018, 19:53
Dezmond
Спасибо!

Re: Настройка postgis (автоматическое заполнения пользователя и даты создания)
Добавлено: 25 дек 2018, 11:08
Dezmond
Все получилось, и поля заполняются автоматически при создании объектов. А как сделать что бы они заполнялись при редактировании?
Re: Настройка postgis (автоматическое заполнения пользователя и даты создания)
Добавлено: 25 дек 2018, 11:22
trir
Re: Настройка postgis (автоматическое заполнения пользователя и даты создания)
Добавлено: 25 дек 2018, 13:51
Dezmond
Вообщем-то это мой первый эксперимент с развертыванием базы даных, по этому не судите строго. Никак не получается написать триггерную функцию.
Дано: слой test c столбцами : id (integer), geom (geometry), comment (character varying 80), user (character varying 80), time (timestamp with time zone);
столбцы :id и geom автоматически заполняются, столбцы user и time заполняются функциями.
За пример я взял вот этот код (Триггер, показанный в этом примере, при любом добавлении или изменении строки в таблице сохраняет в этой строке информацию о текущем пользователе и отметку времени. Кроме того, он требует, чтобы было указано имя сотрудника и зарплата задавалась положительным числом.)
Код: Выделить всё
CREATE TABLE emp (
empname text,
salary integer,
last_date timestamp,
last_user text
);
CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
BEGIN
-- Проверить, что указаны имя сотрудника и зарплата
IF NEW.empname IS NULL THEN
RAISE EXCEPTION 'empname cannot be null';
END IF;
IF NEW.salary IS NULL THEN
RAISE EXCEPTION '% cannot have null salary', NEW.empname;
END IF;
-- Кто будет работать, если за это надо будет платить?
IF NEW.salary < 0 THEN
RAISE EXCEPTION '% cannot have a negative salary', NEW.empname;
END IF;
-- Запомнить, кто и когда изменил запись
NEW.last_date := current_timestamp;
NEW.last_user := current_user;
RETURN NEW;
END;
$emp_stamp$ LANGUAGE plpgsql;
CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
FOR EACH ROW EXECUTE PROCEDURE emp_stamp();
Моя задача примерно такая же, проверить заполнен ли столбец comment и заполнить, кто и когда изменил запись. в идеале еще должна быть проверка по изменению геометрии. Правильный ли шаблон я выбрал? какие значения нужно подставить?
Re: Настройка postgis (автоматическое заполнения пользователя и даты создания)
Добавлено: 25 дек 2018, 13:58
trir
просто нужно сравнить записи NEW и OLD
Re: Настройка postgis (автоматическое заполнения пользователя и даты создания)
Добавлено: 26 дек 2018, 13:05
Dezmond
почему то самолет не взлетает, вот код:
Код: Выделить всё
BEGIN
if(NEW.comment <> OLD.comment) then
NEW.time := current_timestamp;
NEW.user := current_user;
END IF;
RETURN NEW;
END;
Вроде бы формула простая, ошибок не выдает, но колонки не обновляются. Подзкажите новичку, что не так?