#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» . Я отказался от идеи создания триггера. Спасибо за ваше время.