On Fri, Feb 16, 2018 at 8:59 AM, Stephen Frost <sfr...@snowman.net> wrote:
> Tom, > > * Tom Lane (t...@sss.pgh.pa.us) wrote: > > Stephen Frost <sfr...@snowman.net> writes: > > > * David G. Johnston (david.g.johns...@gmail.com) wrote: > > >> Not sure if this is what you mean but there is no concept of > "negative > > >> state" in the permissions system. Everything starts out with no > > >> permissions. Grant adds permissions and revoke un-adds granted > > >> permissions. Revoking something that doesn't exist is either a > no-op or a > > >> warning depending on the context - either way its doesn't setup a > > >> "forbidden" state for the permission. > > > > > This isn't entirely correct. Functions are the classic example where > > > EXECUTE to PUBLIC is part of the default and the "negative" state of > > > having a function where EXECUTE is REVOKE'd from PUBLIC is entirely > > > reasonable and even common. > > > > FWIW, I thought David's description was fine. The fact that the initial > > state of an object typically includes some positive grants doesn't change > > the fact that there's no such thing as a negative grant. In particular, > > if there is a GRANT TO PUBLIC, no amount of revoking that privilege from > > individual users will have any effect, because the public grant is still > > there. > > What I was particularly picking up on was the comment that "Everything > starts out with no permissions" which implied, at least to me, the idea > that no one has any rights on an object until those rights are GRANT'd, > which isn't correct, as I described. > I think its more helpful to say "there are no inherent permissions" and have someone ask "then why can I execute this function" and respond "because the system places every user in to a group called PUBLIC which (like all roles/groups) has a set of granted inheritable permissions; and by default it gets ... on all newly created ...;". And, no, you unfortunately cannot remove a user from the PUBLIC group. You can revoke the permissions granted to PUBLIC by executing using REVOKE ... FROM PUBLIC. Basically, you force the learner to confront/incorporate how the default/PUBLIC privilege defaults system is configured to enhance the usability of a "deny all first" based permission system. Starting from a point of "users have these defaults" obscures that fact and leads to questions like this - which as I said I had myself way back when. Starting from the deny-all beginning was an "ah-ha! moment for me". David J.