mirror of
https://github.com/postgres/postgres.git
synced 2025-07-17 06:41:09 +03:00
Simplify permissions for LOCK TABLE.
The prior behavior was confusing and hard to document. For instance, if you had UPDATE privileges, you could lock a table in any lock mode except ACCESS SHARE mode. Now, if granted a privilege to lock at a given mode, one also has privileges to lock at a less-conflicting mode. MAINTAIN, UPDATE, DELETE, and TRUNCATE privileges allow any lock mode. INSERT privileges allow ROW EXCLUSIVE (or below). SELECT privileges allow ACCESS SHARE. Reviewed-by: Nathan Bossart Discussion: https://postgr.es/m/9550c76535404a83156252b25a11babb4792ea1e.camel%40j-davis.com
This commit is contained in:
@ -292,16 +292,16 @@ LockTableAclCheck(Oid reloid, LOCKMODE lockmode, Oid userid)
|
||||
AclResult aclresult;
|
||||
AclMode aclmask;
|
||||
|
||||
/* Verify adequate privilege */
|
||||
if (lockmode == AccessShareLock)
|
||||
aclmask = ACL_SELECT;
|
||||
else if (lockmode == RowExclusiveLock)
|
||||
aclmask = ACL_INSERT | ACL_UPDATE | ACL_DELETE | ACL_TRUNCATE;
|
||||
else
|
||||
aclmask = ACL_UPDATE | ACL_DELETE | ACL_TRUNCATE;
|
||||
/* any of these privileges permit any lock mode */
|
||||
aclmask = ACL_MAINTAIN | ACL_UPDATE | ACL_DELETE | ACL_TRUNCATE;
|
||||
|
||||
/* MAINTAIN privilege allows all lock modes */
|
||||
aclmask |= ACL_MAINTAIN;
|
||||
/* SELECT privileges also permit ACCESS SHARE and below */
|
||||
if (lockmode <= AccessShareLock)
|
||||
aclmask |= ACL_SELECT;
|
||||
|
||||
/* INSERT privileges also permit ROW EXCLUSIVE and below */
|
||||
if (lockmode <= RowExclusiveLock)
|
||||
aclmask |= ACL_INSERT;
|
||||
|
||||
aclresult = pg_class_aclcheck(reloid, userid, aclmask);
|
||||
|
||||
|
Reference in New Issue
Block a user