>Why not use function which returns table and wrap the >logging (auditing) code in it ?
Because to use a trigger function, you need a trigger, and as previously stated, you cannot have a trigger on select. The same applies for a rule.
Yes, you can't. But why do you need a *trigger* function and trigger ? Why not select via regular function ?
CREATE OR REPLACE FUNCTION public.test_select() RETURNS TABLE(id integer, name text) LANGUAGE sql SECURITY DEFINER -- note here! AS $function$ SELECT 1, 'dima' UNION ALL SELECT 2, 'melvin'; -- just for example I use simple union query $function$
You can revoke SELECT privileges on table and give to some users privileges on function (to prevent them from selecting from table directly).