Re: [HACKERS] proposal: session server side variables - Mailing list pgsql-hackers

From Fabien COELHO
Subject Re: [HACKERS] proposal: session server side variables
Date
Msg-id alpine.DEB.2.20.1612261435590.4911@lancre
Whole thread Raw
In response to Re: [HACKERS] proposal: session server side variables  (Pavel Stehule <pavel.stehule@gmail.com>)
Responses Re: [HACKERS] proposal: session server side variables
List pgsql-hackers
Hello Pavel,

>> AFAICS they are shared between backends, [...] They constitute a 
>> consistent design.
>
> no
> http://stackoverflow.com/questions/2383061/scope-of-oracle-package-level-variables

If stackoverflow says so, too bad for me:-) Now I do not understand the 
point of the example I read on Oracle documentation: why having an 
employee count accessed by some functions if it is reset on each new 
session?

So I do retract "it constitute a consistent design". It looks more like a 
PL/SQL confined hack.

Note that Oracle also seems to have session variables with set with DEFINE 
and referenced with &variable.

>> [...] That could look like:
>>
>>   SET ROLE Admin;
>>   DECLARE @secure_variable INTEGER RESTRICT; -- only accessible to Admin
>>   SET @secure_variable = 3;
>>
>>   SET ROLE BasicUser;
>>   SELECT @secure_variable; -- say NULL or error does not exist...
>>
> what will be if BasicUser does DECLARE @secure_variable

Then there would be a distinct global @secure_variable unrelated to the 
previous one, that would be hidden from Admin who would see its own 
private @secure_variable. Maybe "restrict" is not the right word, though, 
let us use "private".
   SET ROLE User1;   -- use @var: does not exist in scope error   DECLARE @var INTEGER PRIVATE;   SET @var = 1;   --
use@var: get 1
 
   SET ROLE User2;   -- use @var: does not exist in scope error   DECLARE @var INTEGER PUBLIC;   SET @var = 2;   -- use
@var;get 2
 
   SET ROLE User1;   -- use @var: get 1 (private version)
   SET ROLE User3;   -- use @var: get 2 (public version created by User2).


> There are not any granularity of rights - you cannot to grant access ...

Indeed, at least directly. With the above version you can just control 
whether everybody or only the owner has access.

However with some minimal more effort the owner of a private session 
variable could provide a grantable function for accessing this variable: 
the benefit would be that the function is permanent, i.e. would not need 
to be granted each time the variable is used, it could be done once and 
for all.
  CREATE FUNCTION setSecret(INT) SECURITY DEFINER ... AS $$    DECLARE IF NOT EXISTS @secret TEXT PRIVATE;    SET
@secret= $1;  $$ LANGUAGE SQL;
 
  CREATE FUNCTION useSecret(TEXT) SECURITY DEFINER TEXT AS $$     -- would fail if @secret has not been set yet...
SELECTsha256sum(@secret || ':' || $1);  $$ LANGUAGE SQL;
 
  CREATE FUNCTION getSecret() RETURNS TEXT SECURITY DEFINER AS $$    DECLARE IF NOT EXISTS @secret TEXT PRIVATE;
SELECT@secret;  $$ LANGUAGE SQL;
 
  -- then  REVOKE/GRANT ... ON FUNCTION set/use/getSecret(...);

> I am sorry, I don't see benefit in your proposal.

The benefit I see is to have MS/MY-SQL/Oracle like light-weight 
(inexpensive, untransactional) session variables and still a minimal 
access control which might be enough for significant use cases.

If more is really needed, consider the function hack, or maybe some 
one-row table with all the power of grant. Ok, the table solution is more 
heavy weight, but then this is also for a special requirement, and it 
would work as well for persistence.

> Probably there will be only one agreement, so there are not agreement 
> between us :(

It seems so. I do believe that I am trying to propose a solution which 
take into account your use case as I understand it (you did not confirm 
nor infirm) which is to store securely but not safely some kind of 
temporary data between different function calls with SECURITY DEFINER 
within the same session.

I'm trying to avoid "special-case" medium-weight (i.e. pg_class-based) 
session variables with permissions, which could preclude MY/MS-SQL/Oracle 
like light-weight session variables which are I think interesting in their 
own right.

-- 
Fabien.



pgsql-hackers by date:

Previous
From: Craig Ringer
Date:
Subject: Re: [HACKERS] BUG: pg_stat_statements query normalization issues withcombined queries
Next
From: Fabien COELHO
Date:
Subject: Re: [HACKERS] BUG: pg_stat_statements query normalization issueswith combined queries