Как обновить другую таблицу на основе внешней таблицы

#postgresql #postgresql-12

#postgresql #postgresql-12

Вопрос:

У меня есть две базы данных «Продажи» и «Сервис», затем я создал внешнюю оболочку данных в сервисе для двух таблиц БД «Продажи» (учетные записи и заказы) и создал две внешние таблицы в сервисе с именами accounts_sales и orders_sales.

Теперь в внешней таблице order_sales я создал один триггер, который, если есть какой-либо новый заказ для любой учетной записи, запись вставляется в таблицу service.accounts, но она не работает. Ниже приведен код.

 CREATE table sales.accounts
(
  account_id  int,
  account_name text
)

CREATE table sales.order
(
  order_id_id  int,
  order_code   text,
  amount       numeric,
  account-id   int
)
  

Затем создал две внешние таблицы для вышеупомянутой таблицы в среде обслуживания.

 CREATE table accounts_sale
    (
      account_id  int,
      account_name text
    )  SERVER sales
        OPTIONS (schema_name 'public', table_name 'accounts');

    CREATE table order_sales
    (
      order_id_id  int,
      order_code   text,
      amount       numeric,
      account-id   int
    ) SERVER sales
        OPTIONS (schema_name 'public', table_name 'orders');
  

Теперь я хочу, чтобы при создании любого нового заказа на продажу в среде продаж эта новая запись учетной записи была вставлена или обновлена в таблице service.accounts на основе таблицы sales.order.

Это триггер, который я создал в таблице order_sales

     CREATE OR REPLACE  FUNCTION set_sales_account_creation()
    RETURNS trigger
    LANGUAGE 'plpgsql'
 
AS $BODY$
BEGIN
        IF TG_OP = 'INSERT' THEN
            v_effective_from        :=  NEW.created_date;
            v_created_by            :=  NEW.created_by;
        ELSE
            v_effective_from        :=  NEW.last_modified_date;
            v_created_by            :=  NEW.last_modified_by;



        END IF;      
        
        IF TG_OP IN ('INSERT') THEN
        
            SELECT COUNT(1) INTO V_COUNT FROM
            ACCOUNTS WHERE SALES_ACCOUNT_ID = NEW.account_id;
            
            IF V_COUNT IS NULL OR V_COUNT  = 0  THEN
            
                INSERT INTO service.accounts
                SELECT
                FROM accounts_sales
                WHERE account_id = new.account_id;
              END IF; 
            END IF;
            RETURN NUll;
            
END;
$BODY$;
  

Но когда я вставил новый заказ в таблицу Sales.orders, он не работает.

 CREATE TRIGGER TRG_ACCOUNT_SYNCUP_SALES
BEFORE INSERT OR UPDATE 
ON service.order_sales
FOR EACH ROW
EXECUTE PROCEDURE set_sales_account_creation();
  

Комментарии:

1. Что это за CREATE TRIGGER оператор? Можете ли вы описать, как именно это не работает?

2. У меня есть вопрос об обновлении с синтаксисом триггера, и проблем нет. Я создаю триггер для внешней таблицы (orders_sales), но при обновлении таблицы (orders) он синхронизируется с таблицей order_sales, но triiger не работает.

Ответ №1:

Существует фундаментальное заблуждение о том, как работают триггеры на внешних таблицах.

Если вы находитесь в базе данных A, и у вас есть внешняя таблица, которая ссылается на таблицу в базе данных B, то триггер для внешней таблицы в A будет срабатывать всякий раз, когда вы запускаете инструкции DML для внешней таблицы в A. Триггер не сработает, если вы измените таблицу, на которую ссылается B.

Комментарии:

1. Хорошо, спасибо, поэтому, если я хочу это сделать, пожалуйста, предложите мне какой-либо подход, как я могу это сделать, если таблица базы данных B обновляется, тогда данные внешней таблицы также изменятся, и на основе этого изменения данных внешней таблицы, как я могу что-то запустить.

2. Вы можете создать триггер для удаленной таблицы.

3. для этого мне нужно создать внешнюю таблицу в удаленной БД?

4. Скорее всего, да.

5. Я создал функцию с использованием внешних таблиц и написал бизнес-логику. Эта функция запланирована как задание каждые 5 минут, которое синхронизирует данные из базы данных «A» в базу данных «B» . Я отказался от идеи создания триггера. Спасибо за ваше время.