Измените столбец Postre SQL на столбец GENERATED ALWAYS - PullRequest
1 голос
/ 09 июля 2020

У меня уже есть таблица:

cotizacion(idCot(PK), unit_price,unit_price_taxes)

Мне нужно преобразовать unit_price_taxes в сгенерированный столбец, который равен unit_price * 1.16. Проблема в том, что я не могу найти инструкцию alter table, которая даст мне это. Удаление таблицы и ее повторное создание - не вариант, поскольку эта таблица уже глубоко связана с остальной базой данных, и повторная вставка всех записей на данный момент невозможна.

Я пробовал следующее:

 ALTER TABLE cotizacion
  alter column unit_price_taxes set
    GENERATED ALWAYS AS (unit_price*1.16) STORED;

Но не работает. Кто-нибудь знает, как это сделать и возможно ли это вообще? Я бы не хотел создавать новый столбец.

Спасибо!

** EDIT: Я также пробовал следующую реализацию триггера:

CREATE OR REPLACE FUNCTION calculate_price_taxes()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
declare pu money;
begin
    select unit_price from cotizacion into pu
    where idCot = new."idCot";
    
    update  cotizacion
    set unit_price_taxes = pu * (1.16)
    where idCot = new."idCot";
    return new;
end;
$function$
;

И удаление триггера:

Create or replace trigger price_taxes
after update on cotizacion
for each row
execute procedure
calculate_price_taxes()

1 Ответ

1 голос
/ 09 июля 2020

Наиболее вероятная причина перехода вашего триггера к go в бесконечную рекурсию заключается в том, что вы запускаете внутри триггера оператор UPDATE, что является неправильным поступком. Создайте триггер before и присвойте вычисленное значение новой записи:

create trigger update_tax()
  returns trigger
as
$$
begin
  new.unit_price_taxes := unit_price * 1.16;
  return new;
end;
$$
language plpgsql;

create trigger update_tax_trigger()
  before update or insert on cotizacion
  for each row execute procedure update_tax();

Единственный способ «преобразовать» этот столбец в сгенерированный - это отбросить его и добавить снова:

alter table cotizacion
  drop unit_price_taxes;

alter table cotizacion
  add unit_price_taxes numeric generated always as (unit_price*1.16) stored;

Обратите внимание, что при этом будет перезаписана вся таблица, что заблокирует доступ к ней. Добавление триггера будет менее инвазивным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...