Как создать представление с правилом ВСТАВКИ, ВОЗВРАЩАЮЩИМ значение — без ВСТАВКИ в определение правила

#postgresql

#postgresql

Вопрос:

У меня есть следующий упрощенный тестовый пример:

 CREATE TABLE test(id serial PRIMARY KEY, data varchar);

CREATE VIEW test_v AS SELECT * from test;

CREATE FUNCTION insert_test_fn(in_data varchar) RETURNS integer
AS $
DECLARE 
my_id integer;
BEGIN
INSERT INTO test (data) VALUES (in_data)RETURNING id INTO my_id;
-- do things with my_id
RETURN my_id;
END;
$ LANGUAGE plpgsql;

CREATE RULE _INSERT AS
ON INSERT TO test_v DO INSTEAD
SELECT insert_test_fn(new.data);

INSERT INTO test_v (data) VALUES ('testval');

-- I would like to do this:
-- INSERT INTO test_v (data) VALUES ('testval') RETURNING id;
 

У меня есть некоторый клиентский код, который выдает оператор

INSERT INTO test_v (data) VALUES ('testval') RETURNING id; .

Это используется для вставки в test ( ON INSERT TO test_v DO INSTEAD INSERT INTO test ... RETURNING... ) .

Теперь мне нужно изменить часть поведения и вместо прямой вставки в тест, я хочу вызвать функцию, в которой это делается. (Части вставляемых данных должны быть сначала вычислены). Есть ли способ определить _INSERT правило так, чтобы оно все еще работало при вызове с ВОЗВРАЩАЕМЫМ предложением? Это позволило бы мне оставить код клиента без изменений.

Ответ №1:

Это будет работать просто отлично, но это излишне сложно:

  • Вы можете непосредственно вставить в представление, если его определение настолько простое. Но я предполагаю, что ваш реальный случай более сложный.
  • Вам не нужна функция, вы можете напрямую ввести INSERT INTO test ... определение правила.

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

1. Спасибо. Да, случай сложнее, и функция выполняет больше, чем просто вставку. Я автоматически генерирую компоненты пользовательского интерфейса, такие как редакторы crud, из метаданных представлений базы данных, поэтому я бы предпочел сохранить представление как интерфейс вместо вызова функции непосредственно из моего кода приложения. Я все еще могу сделать это особым случаем в приложении и получить идентификатор вставки по кривой последовательности.

2. В любом случае, с вашим подходом проблем нет.