Я пытаюсь создать функцию с триггером, который при изменении поля из таблицы tb_customer должен обновить атрибут last_update_date до current_date модификации. Если пользователь пытается ввести значение в атрибут last_update_date, должна быть выдана ошибка с сообщением и не разрешена эта вставка.
Код таблицы для создания:
CREATE TABLE erp.tb_customer (
cust_no CHARACTER(5) NOT NULL,
cust_name CHARACTER VARYING(50) NOT NULL,
cust_cif CHARACTER VARYING(150) NOT NULL,
last_updated_by CHARACTER VARYING(20) DEFAULT 'SYSTEM',
last_update_date DATE NOT NULL,
CONSTRAINT pk_customer PRIMARY KEY (cust_no)
);
Пока у меня есть этот код:
CREATE OR REPLACE FUNCTION modif_update_date_tracker()
RETURNS trigger AS $$
BEGIN
IF INSERT AT last_update_date THEN
RAISE EXCEPTION 'Not possible to update this field'
END IF;
NEW.last_update_date := current_time;
RETURN NEW;
END;
$$ LANGUAGE plpgsql
------------------------------------------------------------------------------------------------
-- Create trigger 1
------------------------------------------------------------------------------------------------
CREATE TRIGGER trigger_modif_update_date_tracker
BEFORE UPDATE
ON tb_customer
FOR EACH ROW
EXECUTE PROCEDURE modif_update_date_tracker();
Если пользователю не разрешено обновлять столбец, вы должны ОТКАЗАТЬ его от этого. Для этого не нужен триггер.
код тестирования — это то, что вы можете сделать сами. Но я уже могу вам сказать, что UDAPTE не является допустимым значением для TG_OP.
Полный пример триггера можно найти в файле руководство по эксплуатации.
Его нужно создавать как ФУНКЦИЮ, а не как ПРОЦЕДУРУ. Есть и другие проблемы, но я не знаю, какие из них настоящие, а какие вы привнесли, когда перепечатывали.
Привет @jjanes, я изменил это и другие проблемы, такие как неправильно написанный язык и неправильные $$. Мой первый вопрос заключается в функции, как сообщить системе, «если какое-либо поле изменено из этой таблицы». Как я мог это сделать?
BEGIN
IF OLD.last_update_date!=NEW.last_update_date THEN
RAISE EXCEPTION 'Not possible to update this field';
END IF;
NEW.last_update_date := CURRENT_TIMESTAMP;
RETURN NEW;
END;
Есть ли разница между current_timestamp и current_date?
Большое спасибо за ваш отзыв. Однако меня просят сделать это с помощью триггера, чтобы привыкнуть к синтаксису и функциональности. Я где-то видел людей, использующих его для вызова действия, происходящего в темпоральной таблице. Я так понимаю в данном случае это 2 "если", да? Первый, чтобы избежать вставки, а второй, если не произойдет ошибки, для обновления таблицы