#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. В любом случае, с вашим подходом проблем нет.