PostgreSQL-обновить last_update_date до текущего, если изменить в таблице

Я пытаюсь создать функцию с триггером, который при изменении поля из таблицы 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();
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
60
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если пользователю не разрешено обновлять столбец, вы должны ОТКАЗАТЬ его от этого. Для этого не нужен триггер.

код тестирования — это то, что вы можете сделать сами. Но я уже могу вам сказать, что UDAPTE не является допустимым значением для TG_OP.

Полный пример триггера можно найти в файле руководство по эксплуатации.

Большое спасибо за ваш отзыв. Однако меня просят сделать это с помощью триггера, чтобы привыкнуть к синтаксису и функциональности. Я где-то видел людей, использующих его для вызова действия, происходящего в темпоральной таблице. Я так понимаю в данном случае это 2 "если", да? Первый, чтобы избежать вставки, а второй, если не произойдет ошибки, для обновления таблицы

Jose Antonio Piedehierro Arias 04.05.2022 21:59

Его нужно создавать как ФУНКЦИЮ, а не как ПРОЦЕДУРУ. Есть и другие проблемы, но я не знаю, какие из них настоящие, а какие вы привнесли, когда перепечатывали.

Привет @jjanes, я изменил это и другие проблемы, такие как неправильно написанный язык и неправильные $$. Мой первый вопрос заключается в функции, как сообщить системе, «если какое-либо поле изменено из этой таблицы». Как я мог это сделать?

Jose Antonio Piedehierro Arias 05.05.2022 18:35
Ответ принят как подходящий
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?

Jose Antonio Piedehierro Arias 05.05.2022 20:21

Другие вопросы по теме