pg sql 본인의 팀 매니저 관련 0 3 745

by 웅아 [2021.11.29 17:57:35]


버전 : PostgreSQL 9.6.14, compiled by Visual C++ build 1800, 64-bit

본인 포함 팀코드가 같은 팀원을 00010(팀원을) 모두 가져오고 싶습니다.

사원으로 로그인하면 본인의 아이디만 대입하여 본인것만 가져옵니다.

 

참고 블로그 글

1. 게시판의 리스트를 가져온다고 가정하고

- 작성자 : 본인 게시물만

- 팀장 : 팀의 모든 게시물

- 부서장 : 해당부서의 모든 게시물

- 대표 : 모든 부서의 게시물

- 관리부서 : 모든 부서의 게시물

이렇게 리스트를 보여주어야 한다면

2. 필요한 건 아래 2가지만 있으면 되고 프로시져로 넘길 파라미터는 조회자의 id하나면 충분하다.

- 조회자의 id

- 조회자의 부서와 직책등을 가지고 있는 테이블의 정보

3. 게시판 table : board_list

- pk : no identity(1,1)

- 작성자 id : reg_user_id

- 작성자 team : team_code

- 작성자 부서 : div_code

- title, content, cdate 등 필요한 컬럼 추가

사용자 table : user

- user_id : 사용자 id

- 팀장 권한 : team_b = 1

- 부서장 권한 : div_b = 1

- 대표 권한 : ceo_b = 1

- 팀 코드 : team_code

- 부서 코드 : div_code

여기서 사용자 테이블에 부서 코드까지는 없어도 되고 조직 테이블에서 조인으로 가져와도 된다. 편의상 사용자 table에 모든 정보가 있다고 가정하자.

4. 쿼리 작성

- 프로시져 파라미터 : 조회자 id : @user_id

select * from board_list with(nolock) where reg_user_id in ( /* 조회자의 부서와 직책은 파라미터로 넘기지 않아도 된다. user 테이블을 가지고 모든 것을 판단해서 리스트를 가져온다. 리스트를 가져올 때 union all 을 사용해서 조회 권한이 있는 모든 사용자의 글을 가져온다. */ -- 1. 작성자 본인 게시물 select user_id from user u1 with(nolock) where user_id = @user_id union all -- 2. 팀장일 경우 팀원이 작성한 모든 글 -- 조회자가 팀장일 경우에는 팀 코드를 가져오고 해당 팀코드로 작성된 모든 글을 가져온다. select user_id from user u1 with(nolock) where u1.team_code in (select team_code from user u2 with(nolock) where u2.user_id = @user_id and u2.team_b = '1' ) union all -- 3. 부서장일 경우 부서원이 모두 작성한 글 -- 조회자가 부서장일 경우에는 부서 코드를 가져오고 해당 부서코드로 작성된 모든 글을 가져온다. select user_id from user u1 with(nolock) where u1.div_code in (select div_code from user u2 with(nolock) where u2.user_id = @user_id and u2.div_b = '1' ) union all -- 4. 대표일 경우 모든 직원이 작성한 글 -- 조회자가 대표일 경우에는 모든 글을 가져온다. -- 대표자일 경우 A 서브 쿼리에서 값이 있을 것이고 따라서 u1 테이블의 모든 사용자가 리턴된다. select user_id from user u1 with(nolock) where exists (select 'x' --> A from user u2 with(nolock) where u2.user_id = @user_id and u2.ceo_b = '1' ) union all -- 5. 관리 부서일 경우 모든 직원이 작성한 글을 가져온다. -- 조회자의 team_code가 'AA1'일 경우에는 서버 쿼리의 값이 있게 되고 u1 테이블의 모든 데이터를 가져온다. select user_id from user u1 with(nolock) where exists (select 'x' --> A from user u2 with(nolock) where u2.user_id = @user_id and u2.team_code = 'AA1' ) )

 

by 웅아 [2021.11.29 22:01:49]

자체 해결 완료!


by 마농 [2021.11.30 09:33:55]

1. 부서코드, 팀코드가 사용자 테이블뿐 아니라 게시판 테이블에도 존재하네요.
아마도 글 작성 당시 소속을 저장한 듯 한데.
조회 기준이 사용자 소속 기준인지? 게시글 소속 기준인지? 명확히 해야 합니다.
현재 작성된 쿼리는 사용자 기준이네요.
우리 직원이 다른 부서로 이동을 하게 될 경우
해당 직원이 우리 부서에 있을 때 작성한 글이 부서 이동 이후에 보여야 할지 말아야 할지?
내가 이동전 다른 부서에서 작성한 글을 조회할 수 있을지? 없을지?
2. 권한 컬럼이 여러개네요.
하나의 컬럼에 숫자를 다르게 하면 편할 것 같은데요.


by 웅아 [2021.11.30 17:38:48]

앗 마농님 저건 다른데 예시를 가져온거입니다 ^^;

저런형식으로 유저 테이블에서 사원일경우 자기 자신만 나오게하고 팀장일경우 자신의 팀원까지 모두 나오고

그위 본부장과장일때는 모든 사원 데이터를 조회할수 있게 하였습니다.

이렇게 만든걸 함수로 빼서 권한이 필요한 테이블에 IN절로 함수를 호출하여 사용 했습니다.

감사합니다 ^.^

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입