Как указывал Лоренц, это невозможно с помощью правила.
Но рассматривали ли вы функцию, которая дает доступ к этой таблице, а не прямой доступ к самой таблице?
Вы можете создать функцию, которая запускает запрос, сохраняет результат и возвращает его. Затем только предоставьте привилегию на выполнение функции и отзовите любой прямой доступ к этой таблице.
Что-то вроде:
create function get_usertable(p_key integer)
returns setof usertable
as
$$
with result as (
select *
from usertable
where id = p_key
), log_query as (
insert into selectlog (prim_key, val)
select *
from result
)
select *
from result;
$$
language sql;
Основным недостатком этого решения является то, что вы должны предоставить параметр для любого условия, которое может потребоваться (параметр p_key
является только примером). Если параметры для предложения WHERE
ограничены, это может быть альтернативой. Если вам нужны более сложные условия, вы можете сделать это с помощью динамического SQL (и функции PL / pgSQL вместо функции SQL), но это также становится ужасно быстрым.