At Wed, 20 Mar 2019 07:13:28 +0900 (JST), Tatsuo Ishii <is...@sraoss.co.jp> 
wrote in <20190320.071328.485760446856666486.t-is...@sraoss.co.jp>
> >> I (and Hoshiai-san) concern about following case:
> >> 
> >> # revoke usage on schema s1 from foo;
> >> REVOKE
> >> :
> >> [connect as foo]
> >> test=> select to_regclass('s1.t1')::oid;
> >> ERROR:  permission denied for schema s1
> > 
> > That works in a transaction. It looks right that the actually
> > revoked schema cannot be accessed.
> > 
> > S1:foo: begin;
> > S2:su : revoke usage on schema s1 from foo;
> > S1:foo: select to_regclass('s1.t1')::oid;
> >>  to_regclass 
> >> -------------
> >>        16418
> > S2:foo: commit;
> > S2:foo: select to_regclass('s1.t1')::oid;
> >> ERROR:  permission denied for schema s1
> 
> I'm confused. How is an explicit transaction related to the topic?

Since your example revokes the privilege just before (or
simultaneously with) "using" the unprivileged object. If the
given object name is obtained before the revokation, it can be
protected by beginning a transaction before obtaining the
name. If not, it is right to emit an error.

As another discussion, as I wrote just before, can be raised that
the behavior really doesn't protect nothing. We can lookup the
oid of an unprivileged objects through the system catalogs.

So I think it is reasonable that we just ignore privileges in the
commands. Maybe regclassin and friends also should be changed in
the same way.

If we protect system catalogs later, the commands naturally will
follow the change.

regards.

-- 
Kyotaro Horiguchi
NTT Open Source Software Center


Reply via email to