2014-02-13 2 views
0

pg_catalog.pg_cast을 제한된 사용자 (Postgres 9.3)에서 업데이트하고 싶습니다.Postgres - pg_catalog.pg_cast 업데이트시 권한이 거부되었습니다.

update pg_cast set castcontext = 'i' where oid in (select c.oid from pg_cast c inner join pg_type src on src.oid = c.castsource inner join pg_type tgt on tgt.oid = c.casttarget where src.typname like 'int%' and tgt.typname like 'bool%'); 

오류와 함께 종료 :

그러나 내가 필요로하는 쿼리를 실행

ERROR: permission denied for relation pg_cast 

그러나 권한이 올바르게 설정 될 것으로 보인다. 쿼리까지의 I는 DB 이후 단계 및 사용자 생성을 참조하십시오 : 나는 무엇을 더해야

psql -c "create database test1 WITH ENCODING 'UTF8' LC_COLLATE='en_GB.UTF8' LC_CTYPE='en_GB.UTF8' TEMPLATE=template0;" -U postgres 
psql -U postgres test1; 
test1=# CREATE USER test1 PASSWORD 'test1'; 
test1=# GRANT ALL ON SCHEMA public TO test1; 
test1=# GRANT ALL ON ALL TABLES IN SCHEMA public TO test1; 
test1=# GRANT SELECT ON TABLE pg_catalog.pg_cast TO test1; 
test1=# GRANT SELECT ON TABLE pg_catalog.pg_type TO test1; 
test1=# GRANT UPDATE ON TABLE pg_catalog.pg_cast TO test1; 
test1=# \q 

sudo service postgresql-9.3 restart 

PGPASSWORD=test1;psql -U test1 test1 

test1=> \z pg_catalog.pg_cast 
        Access privileges 
    Schema | Name | Type | Access privileges | Column access privileges 
------------+---------+-------+-------------------+-------------------------- 
pg_catalog | pg_cast | table | =r/postgres  +| 
     |   |  | test1=rw/postgres | 
(1 row) 

test1=> \z pg_catalog.pg_type 
        Access privileges 
    Schema | Name | Type | Access privileges | Column access privileges 
------------+---------+-------+-------------------+-------------------------- 
pg_catalog | pg_type | table | =r/postgres  +| 
     |   |  | test1=r/postgres | 
(1 row) 

test1=> SELECT grantee, privilege_type FROM information_schema.role_table_grants WHERE table_name='pg_cast'; 
grantee | privilege_type 
---------+---------------- 
test1 | SELECT 
test1 | UPDATE 
(2 rows) 

test1=> update pg_cast set castcontext = 'i' where oid in (select c.oid from pg_cast c inner join pg_type src on src.oid = c.castsource inner join pg_type tgt on tgt.oid = c.casttarget where src.typname like 'int%' and tgt.typname like 'bool%'); 
ERROR: permission denied for relation pg_cast 

test1 사용자와 쿼리 실행을 가능하게? 감사합니다. .

답변

2

정말 시스템 카탈로그를 직접 업데이트하면 안됩니다. "허가가 거부되었습니다"라는 오류는 Postgres가 발에서 자신을 쏘지 못하게합니다.

당신은 정말 여기에서 시작하십시오 (당신이 뭔가를 어기면, 당신은 ... 두 조각을 유지하기 위해 수) 것을 원하는 경우

: https://serverfault.com/questions/300123/how-to-edit-system-catalogs-in-postgresql-8-1

+0

덕분에, 나는 인식하지 않았다. 그래서 카탈로그 업데이트 (권한있는 사용자에 의해 수행됨) 및 앱 사용자에게 읽기 전용 액세스 권한을 부여하는 솔루션으로 끝 맺었습니다. –