DB
GRANT 권한 주기. SEARCH_PATH 세팅. (postgreSQL)
미션 :: user1계정의 test_tbl 테이블을 user2계정에 SELECT 권한 주기.
1) 테이블 SELECT 권한 주기
GRANT SELECT ON TABLE user1.test_tbl TO user2
=> user2 계정으로 접속해서, SELECT * FROM test_tbl; 를 돌려보니, test_tbl 테이블을 찾지 못하는 오류 발생.
2) 스키마 접근 권한 주기
GRANT USAGE ON SCHEMA user1 TO user2;
=> 여전히 test_tbl 테이블을 찾지 못함.
3) SEARCH_PATH 세팅
show search_path; // 현재 search_path 확인
SET search_path TO user2, user1, public
=> SELECT * FROM test_tbl; 정상 조회 가능.
※ search_path 관련 참고사항
- serach_path는 입력된 순서대로 테이블 스페이스를 읽는다.
- 영구적으로 설정해주기 위해서는 postgresql.conf 파일에 search_path를 명시해주어야 한다.
1) SELECT name, setting FROM pg_settings WHERE category = 'File Locations'; //postgresql.conf 파일 찾기
2) postgresql.conf 파일에 search_path='user2, user1, public' 명시
★ 결론
GRANT 권한 줄 때, 테이블 SELECT 권한만 주면 끝나는 것이 아니기 때문에,
스키마 권한, search_path 모두 확인 해주어야 하고, 권한이 없으면 해당 권한까지 넘겨 주어야 한다.
'DB' 카테고리의 다른 글
PostgreSQL에서 not equal 시 null 값 포함하여 처리하기(IS DISTINCT FROM) (0) | 2019.10.14 |
---|---|
postgreSQL에서 그룹별 넘버링 방법 ( ROW_NUMBER, RANK, DENSE_RANK ) (0) | 2019.03.13 |
PostgreSQL에서 not equal 시 null 값 포함하여 처리하기(IS DISTINCT FROM)
SELECT ADDR FROM STUDENT WHERE ADDR != '서울'
서울이 아닌 지역을 출력하는 SELECT 쿼리이다.
이 때 ADDR은 'NULL 값은 비교대상에서 제외' 한 다른 지역의 주소들이 출력된다.
ex)
ADDR |
인천 |
경기 |
부산 |
NULL값을 포함하여 NOT EQUAL을 사용하고 싶으면
IS DISTINCT FROM 절을 사용하면 된다.
SELECT ADDR FROM STUDENT WHERE ADDR IS DISTINCT FROM '서울'
== SELECT ADDR FROM STUDENT WHERE ADDR != '서울' or ADDR IS NULL
ex)
ADDR |
인천 |
경기 |
부산 |
NULL |
※ ADDR 컬럼이 NULL인 ROW가 존재할 경우에 NULL을 포함하여 출력됨.
'DB' 카테고리의 다른 글
GRANT 권한 주기. SEARCH_PATH 세팅. (postgreSQL) (0) | 2019.11.22 |
---|---|
postgreSQL에서 그룹별 넘버링 방법 ( ROW_NUMBER, RANK, DENSE_RANK ) (0) | 2019.03.13 |
postgreSQL에서 그룹별 넘버링 방법 ( ROW_NUMBER, RANK, DENSE_RANK )
1. 아래와 같은 요건을 SQL 쿼리로 작성하시오. ( 각 선수별로 가능한 포메이션을 기준으로 ROW_NUM 세팅 )
ROW_ID | NAME |
FORMATION | ROW_NUM |
1 | ERIKSEN | LWF | 1 |
2 | ERIKSEN | RWF | 2 |
3 | ERIKSEN | CAM | 3 |
4 | ERIKSEN | CM | 4 |
5 | KANE |
CF | 1 |
6 | SON |
CF | 1 |
7 | SON |
LWF | 2 |
8 | SON |
RWF | 3 |
9 | SON |
CAM | 4 |
10 | VERTONGHEN | CB | 1 |
11 | VERTONGHEN | LB | 2 |
SQL :
SELECT ROW_ID ,NAME ,FORMATION ,ROW_NUMBER() OVER( PARTITION BY NAME ORDER BY ROW_ID ) AS ROW_NUM FROM TOT_PLAYER ORDER BY ROW_ID
해설 : 선수이름을 그룹으로 묶어서 ROW_NUMBER() 계산한다.
키워드 : ROW_NUMBER / PARTITION BY
ROW_ID | NAME |
GOAL | ROW_NUM |
1 | KANE |
15 | 1 |
2 | SON |
15 | 1 |
3 | ERIKSEN | 6 | 2 |
4 | ALLI | 4 | 3 |
5 | LAMELA | 4 | 3 |
6 | MOURA | 4 | 3 |
7 | VERTONGHEN | 3 | 4 |
8 | ALDERWEIRELD | 2 | 4 |
SQL :
SELECT ROW_ID ,NAME ,FORMATION ,DENSE_RANK() OVER( ORDER BY GOAL DESC) AS ROW_NUM FROM TOT_PLAYER ORDER BY ROW_ID
해설 : 득점순위를 찾는다. -> RANK 또는 DENSE_RANK 함수 사용
동일한 득점이 있을 경우 그 다음 순위에 공백이 생기지 않는다 -> DENSE_RANK 함수 사용
키워드 : DENSE_RANK
ROW_ID | NAME |
GOAL | ROW_NUM |
1 | KANE |
15 | 1 |
2 | SON |
15 | 1 |
3 | ERIKSEN | 6 | 3 |
4 | ALLI | 4 | 4 |
5 | LAMELA | 4 | 4 |
6 | MOURA | 4 | 4 |
7 | VERTONGHEN | 3 | 7 |
8 | ALDERWEIRELD | 2 | 7 |
SQL :
SELECT ROW_ID ,NAME ,GOAL ,RANK() OVER( ORDER BY GOAL DESC ) AS ROW_NUM FROM TOT_PLAYER ORDER BY ROW_ID
해설 : 득점순위를 찾는다. -> RANK 또는 DENSE_RANK 함수 사용
동일한 득점이 있을 경우 그 다음 순위에 공백이 생긴다 -> RANK 함수 사용
키워드 : RANK
4. 아래와 같은 요건을 SQL 쿼리로 작성하시오. ( 선수 역할을 기준으로 득점 순위 계산 )
* 동일한 골 기록일 경우 같은 순위 랭크, 그 다음 순위는 RANK에 공백 순위 발생
ROW_ID | ROLL | NAME |
GOAL | ROW_NUM |
1 | ST | KANE |
15 | 1 |
2 | ST | SON |
15 | 1 |
3 | ST | LIORENTE | 10 | 3 |
4 | MF | ERIKSEN | 6 | 1 |
5 | MF | ALLI | 4 | 2 |
6 | MF | LAMELA | 4 | 2 |
7 | MF | MOURA | 4 | 2 |
8 | MF | WANYAMA | 1 | 5 |
9 | DF | VERTONGHEN | 3 | 1 |
10 | DF | ALDERWEIRELD | 2 | 2 |
SQL :
SELECT ROW_ID ,NAME ,GOAL ,RANK() OVER ( PARTITION BY ROLL ORDER BY GOAL DESC ) AS ROW_NUM FROM TOT_PLAYER ORDER BY ROW_ID
해설 : 포지션 별 득점순위를 찾는다. -> RANK 또는 DENSE_RANK 함수 사용
동일한 득점이 있을 경우 그 다음 순위에 공백이 생긴다 -> RANK 함수 사용
포지션을 그룹으로 묶어준다 -> PARTITION BY 사용
키워드 : RANK / PARTITION BY
'DB' 카테고리의 다른 글
GRANT 권한 주기. SEARCH_PATH 세팅. (postgreSQL) (0) | 2019.11.22 |
---|---|
PostgreSQL에서 not equal 시 null 값 포함하여 처리하기(IS DISTINCT FROM) (0) | 2019.10.14 |