2016-12-26 15:53 GMT+01:00 Fabien COELHO <coe...@cri.ensmp.fr>:

>
> 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?
>

please, can send link?

so some better documentation
https://docs.oracle.com/cd/E11882_01/appdev.112/e25519/packages.htm#LNPLS99926

I am sure, so package variables are not shared between sessions/backends -
bacause Oracle uses different mechanism for interprocess communication -
wrote it in Orafce

"When a session references a package item, Oracle Database instantiates the
package for that session. Every session that references a package has its
own instantiation of that package."




>
> 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...
>      SELECT sha256sum(@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.
>

 I am sorry, it is not secure. Theoretically it can work if you have
granted order of function calls, but if not?

regards

Pavel


>
> --
> Fabien.
>

Reply via email to