새로 생성된 객체에 대한 권한 거부 오류가 발생했습니다. 스키마에서 새로 생성된 객체에 액세스하는 데 필요한 권한을 사용자에게 부여하려면 어떻게 해야 합니까?
간략한 설명
스키마에서 새로 생성된 객체에 액세스하려는 사용자에게 객체 소유자 또는 슈퍼 사용자가 액세스 권한을 부여해야 합니다.
사용자가 스키마에서 새로 생성된 객체에 액세스할 수 없는 경우 다음과 같은 오류가 발생할 수 있습니다.
"ERROR: permission denied for relation 'objectname'"
이 오류는 액세스 권한이 처음 부여되었을 때 스키마에 있는 객체에 대해서만 액세스 권한이 부여된 경우에 발생합니다. 기본적으로 현재 스키마에서 생성된 객체에 대한 액세스 권한은 자동으로 부여되지 않습니다.
이 문제를 해결하려면 사용자 또는 그룹 역할을 통해 액세스 권한을 부여합니다. ALTER DEFAULT PRIVILEGES 명령을 사용하십시오.
해결 방법
스키마의 현재 생성된 테이블과 앞으로 생성될 테이블에 권한을 부여하려면 슈퍼 사용자로서 다음을 수행합니다.
-
스키마에 사용 액세스 권한을 부여하고 현재 스키마 아래에 있는 모든 테이블에 SELECT 액세스 권한을 부여하려면 다음 명령을 실행합니다.
참고: newtestschema를 스키마 이름으로, newtestuser를 사용자 이름으로 바꾸십시오.
grant usage on schema newtestschema to newtestuser;
grant select on all tables in schema newtestschema to newtestuser;
-
스키마에서 앞으로 생성될 테이블에 대해 사용자에게 SELECT 액세스 권한을 부여하려면 다음 명령을 실행합니다.
참고: awsuser를 스키마에서 향후 객체를 생성하는 데 사용할 사용자 이름으로 바꾸십시오. 이후 newtestschema를 스키마 이름으로, newtestuser를 향후 객체에 액세스해야 하는 사용자 이름으로 바꾸십시오.
alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;
참고: 기본 권한은 새 객체에만 적용됩니다. ALTER DEFAULT PRIVILEGES 명령을 실행할 때 기존 객체에 대한 권한은 변경되지 않습니다.
-
사용자에게 기본 권한이 부여되었는지 확인하려면 슈퍼 사용자로 다음 쿼리를 실행합니다.
select * from svv_default_privileges where grantee_name = 'newtestuser';
select * from svv_default_privileges where schema_name = 'newtestschema';
select * from svv_default_privileges where grantee_type = 'role';
사용자에게 직접 부여된 권한을 검토하려면 슈퍼 사용자로 다음 쿼리를 실행합니다.
SELECT * FROM svv_relation_privileges where identity_name = 'newtestuser';
해결 방법 예시
다음 예시는 이 구성으로 시작합니다.
- 슈퍼 사용자가 아닌 newtestuser 사용자.
- newtestschema 스키마와 몇 개의 레코드를 포함하여 해당 스키마에 newtesttable1 테이블.
awsuser 슈퍼 사용자는 newtestuser에게 newtestschema 스키마와 현재 해당 스키마에 있는 모든 테이블에 액세스 권한을 부여합니다. 액세스 권한을 부여하기 위해 awsuser는 다음 예시 명령을 사용합니다.
grant usage on schema newtestschema to newtestuser;
grant select on all tables in schema newtestschema to newtestuser;
이 명령은 newtestuser에게 newtestschema에 있는 현재 테이블에 대한 SELECT 액세스 권한을 부여합니다. 지금은 newtesttable1 테이블만 newtestschema에 있습니다. 그에 따라 newtestuser는 newtesttable1에 액세스할 수 있습니다.
다음으로 awsuser는 newtestschema 아래에 또 다른 테이블인 newtesttable2를 생성합니다. newtestuser가 newtestschema.newtesttable2 테이블에서 SELECT 쿼리를 실행하면 다음 오류가 표시됩니다.
ERROR: permission denied for relation newtesttable2.
오류를 해결하기 위해 awsuser는 다음 단계를 수행합니다.
-
newtesttable2에 대한 액세스 권한을 부여합니다. 이를 위해 awsuser는 다음 예시 명령을 실행합니다.
grant select on table newtestschema.newtesttable2 to newtestuser;
-
newtestuser에게 newtestschema에서 awsuser가 향후에 생성할 테이블에 대한 액세스 권한을 부여합니다. 이를 위해 awsuser는 다음 예시 명령을 실행합니다.
alter default privileges for user awsuser in schema newtestschema grant select on tables to newtestuser;
이제 awsuser가 newtestschema 아래에 newtesttable3 테이블을 새로 생성하면 newtestuser는 newtesttable3에 대한 SELECT 액세스 권한을 갖게 됩니다.
-
newtestuser에게 기본 권한이 부여되었는지 확인하기 위해 awsuser는 다음 쿼리를 실행합니다.
select * from svv_default_privileges where grantee_name = 'newtestuser';
select * from svv_default_privileges where schema_name = 'newtestschema';
select * from svv_default_privileges where grantee_type = 'role';
newtestuser에게 직접 부여된 권한을 검토하기 위해 awsuser는 다음 쿼리를 실행합니다.
SELECT * from svv_relation_privileges where identity_name = 'newtestuser';
출력에서 awsuser가 newtestschema에서 awsuser가 생성한 모든 테이블에 대한 SELECT 권한을 newtestuser에게 부여함을 보여줍니다.
schema_name | object_type | owner_id | owner_name | owner_type | privilege_type | grantee_id | grantee_name | grantee_type | admin_option
newtestschema | RELATION | 100 | awsuser | user | SELECT | 101 | newtestuser | user | FALSE
관련 정보
PG_DEFAULT_ACL