Ming LI created HAWQ-1076:
-----------------------------

             Summary: permission denied for using sequence with SELECT/USUAGE 
privilege
                 Key: HAWQ-1076
                 URL: https://issues.apache.org/jira/browse/HAWQ-1076
             Project: Apache HAWQ
          Issue Type: Bug
          Components: Catalog
            Reporter: Ming LI
            Assignee: Lei Chang
             Fix For: backlog


Customer had a table with a column taking default value from a sequence. And 
they want a role have readonly access to the table as well as the sequence. 
However they have to grant ALL privilege on the sequence to the user for 
running SELECT query. Otherwise it will fail with "ERROR:  permission denied 
for sequence xxx".

Following are the steps to reproduce the issue in house.

1. Create a table with column taking default value from a sequence. And grant 
SELECT/USAGE privilege on the sequence to a user
{code:java}
[gpadmin@hdm1 ~]$ psql
psql (8.2.15)
Type "help" for help.

gpadmin=# \d ns1.t1
                       Append-Only Table "ns1.t1"
 Column |  Type   |                      Modifiers                      
--------+---------+-----------------------------------------------------
 c1     | text    | 
 c2     | integer | not null default nextval('ns1.t1_c2_seq'::regclass)
Compression Type: None
Compression Level: 0
Block Size: 32768
Checksum: f
Distributed randomly

gpadmin=# grant SELECT,usage on sequence ns1.t1_c2_seq to ro_user;
GRANT

gpadmin=# select * from pg_class where relname='t1_c2_seq';
  relname  | relnamespace | reltype | relowner | relam | relfilenode | 
reltablespace | relpages | reltuples | reltoast
relid | reltoastidxid | relaosegrelid | relaosegidxid | relhasindex | 
relisshared | relkind | relstorage | relnatts | 
relchecks | reltriggers | relukeys | relfkeys | relrefs | relhasoids | 
relhaspkey | relhasrules | relhassubclass | rel
frozenxid |                  relacl                  | reloptions 
-----------+--------------+---------+----------+-------+-------------+---------------+----------+-----------+---------
------+---------------+---------------+---------------+-------------+-------------+---------+------------+----------+-
----------+-------------+----------+----------+---------+------------+------------+-------------+----------------+----
----------+------------------------------------------+------------
 t1_c2_seq |        17638 |   17650 |       10 |     0 |       17649 |          
   0 |        1 |         1 |         
    0 |             0 |             0 |             0 | f           | f         
  | S       | h          |        9 | 
        0 |           0 |        0 |        0 |       0 | f          | f        
  | f           | f              |    
        0 | {gpadmin=rwU/gpadmin,ro_user=rU/gpadmin} | 
(1 row)

gpadmin=# insert into ns1.t1(c1) values('abc');
INSERT 0 1
gpadmin=# select * from ns1.t1;
 c1  | c2 
-----+----
 abc |  3
(1 row)
{code}

2. Connect to database as user with readonly access and run SELECT query 
against the table. It will fail with "permission denied" error
{code:java}
[gpadmin@hdm1 ~]$ psql -U ro_user -d gpadmin
psql (8.2.15)
Type "help" for help.

gpadmin=> select * from ns1.t1;
ERROR:  permission denied for sequence t1_c2_seq
{code}

3. grant ALL privilege on the sequence to that user, which makes it be able to 
SELECT out data from the table

{code:java}
[gpadmin@hdm1 ~]$ psql
gpadmin-# psql (8.2.15)
gpadmin-# Type "help" for help.
gpadmin-# 
gpadmin=# grant update on sequence ns1.t1_c2_seq to ro_user;
GRANT
gpadmin=# select * from pg_class where relname='t1_c2_seq';
  relname  | relnamespace | reltype | relowner | relam | relfilenode | 
reltablespace | relpages | reltuples | reltoast
relid | reltoastidxid | relaosegrelid | relaosegidxid | relhasindex | 
relisshared | relkind | relstorage | relnatts | 
relchecks | reltriggers | relukeys | relfkeys | relrefs | relhasoids | 
relhaspkey | relhasrules | relhassubclass | rel
frozenxid |                  relacl                   | reloptions 
-----------+--------------+---------+----------+-------+-------------+---------------+----------+-----------+---------
------+---------------+---------------+---------------+-------------+-------------+---------+------------+----------+-
----------+-------------+----------+----------+---------+------------+------------+-------------+----------------+----
----------+-------------------------------------------+------------
 t1_c2_seq |        17638 |   17650 |       10 |     0 |       17649 |          
   0 |        1 |         1 |         
    0 |             0 |             0 |             0 | f           | f         
  | S       | h          |        9 | 
        0 |           0 |        0 |        0 |       0 | f          | f        
  | f           | f              |    
        0 | {gpadmin=rwU/gpadmin,ro_user=rwU/gpadmin} | 
(1 row)

gpadmin=# \q
[gpadmin@hdm1 ~]$ psql -U ro_user -d gpadmin
psql (8.2.15)
Type "help" for help.

gpadmin=> select * from ns1.t1;
 c1  | c2 
-----+----
 abc |  3
(1 row)
{code}

It doesn't seem reasonable for a user to have FULL privilege on a sequence to 
merely SELECT data from a table. Is it a software defect or a designed behavior?



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to