회사에서 사용하고 있는 erp는 최초구축버전(알파라고 칭함)이 있었고
이 알파가 맛이가서 현재의 버전(베타라고 칭함)으로 알파의 소스를 베이스로 제작되었다.
근데 이 알파에서 베타가 깔끔하게 넘어온 것이 아니고
여러가지 사정으로 불필요한 소스가 덕지덕지 붙어서 (쿼리와 db설계, 그리고 필요없는 테이블과 데이터-중복값도 꽤 되는 것으로 보인다)
만들어졌다.
그래, 이정도는 이해할 수 있다.
가장 중요한건 이 시스템에 대해 나에게 알려줄 사수도 없고 (있긴 있는데 난 전래동화처럼 이름만 들었고 본적은 없다.)
그리고 그 전래동화 속 인물도 이 시스템에서 만지는 건 디비도 아니고 그냥 웹클라이언트쪽을 손본다는 정도로 들었다.
회사 오라클서버는 궁극적으로 관리자는 없는 셈이다.
문제는 이 서버가 심심하면 뻗는다는 건데. 이때마다 재부팅으로 트러블슈팅을 하고 있다.
그래서 난 요청을받으면(웹페이지에서 정보조회가 안된다는 요청)
원격접속을 하여 서버 컴퓨터 두대를 재부팅해준다.
한대는 was 서버인데 이 컴퓨터는 재부팅을 한다음 was 서버를 시동하는 ToinB라는 프로그램을 구동해줘야한다.
(자동으로 되야하지만 오라클 서버가 죽어있거나 기타의 이유로 구동해줘야 할때가 대부분임)
아무튼, 이 병신같은 시스템을 탈피하기 위해 서버의 재 구축을 생각중이고
12월 부터는 본격적으로 작업을 할 예정이다.
그럼 잠시 서버가 얼마나 병신처럼 되어있는지 알아보자
로그인하는데 필요한 정보는 id, pw 두개다.
상식적으로 생각해도 이 두가지를 key로 사용하여 db를 쿼리하여 성공, 실패를 뿌려주는 것이 맞는 일이다.
TBL_VarAdd ("select_sql", TB_STRING, 20001, 0); strcpy(select_sql,""); strcat(select_sql,"SELECT\n"); strcat(select_sql,"\tVT_BONSA_YN,\n"); strcat(select_sql,"\tVT_HS_CODE,\n"); strcat(select_sql,"\tVT_HS_NM,\n"); strcat(select_sql,"\tVT_HS_PWD,\n"); strcat(select_sql,"\tVT_HS_TEL_NO,\n"); strcat(select_sql,"\tVT_HS_CEL_NO,\n"); strcat(select_sql,"\tVT_HS_EMAIL_ADDR,\n"); strcat(select_sql,"\tVT_HS_SDATE,\n"); strcat(select_sql,"\tVT_HS_EDATE,\n"); strcat(select_sql,"\tVT_DEPT_CODE,\n"); strcat(select_sql,"\tVT_DEPT_NAME,\n"); strcat(select_sql,"\tVT_CAREER_CD,\n"); strcat(select_sql,"\tVT_POS_CD\n"); strcat(select_sql,"FROM\n"); strcat(select_sql,"\tVW_CA_MEMBER\n"); strcat(select_sql,"WHERE\n"); strcat(select_sql,"\tVT_HS_CODE = :ArgID\n"); strcat(select_sql,"\tAND VT_HS_PWD = :ArgPWD\n"); strcat(select_sql,"\n"); |
이 소스는 cpp로 작성된 쿼리 부분이다.
VW_CA_MEMBER 테이블에서 id와 pw가 일치하는 것을 찾아서 정보를 가져오는 것이다.
row가 존재하면 로그인성공 없으면 실패..
뭐 여기까지는 좋다.
근데 여기서 문제가 있다.
VW_CA_MEMBER 은 뷰이다.
그럼 이 뷰를 까볼까?
DROP VIEW CAIS_NEW.VW_CA_MEMBER; /* Formatted on 2013-11-01 오후 3:41:19 (QP5 v5.115.810.9015) */ CREATE OR REPLACE FORCE VIEW CAIS_NEW.VW_CA_MEMBER ( VT_BONSA_YN, VT_HS_CODE, VT_HS_NM, VT_HS_PWD, VT_HS_TEL_NO, VT_HS_CEL_NO, VT_HS_EMAIL_ADDR, VT_HS_SDATE, VT_HS_EDATE, VT_DEPT_CODE, VT_DEPT_NAME, VT_CAREER_CD, VT_MNU_GRP_IDX, VT_POS_CD ) AS SELECT 'Y' VT_BONSA_YN, A.HS_CODE VT_HS_CODE, A.HS_NM VT_HS_NM, A.HS_PWD VT_HS_PWD, A.HS_TEL_NO VT_HS_TEL_NO, A.HS_CEL_NO VT_HS_CEL_NO, A.HS_EMAIL_ADDR VT_HS_EMAIL_ADDR, B.ACT_DT VT_HS_SDATE, '29991231' VT_HS_EDATE, B.DEPT_CODE VT_DEPT_CODE, C.DEPT_NAME VT_DEPT_NAME, B.CAREER_CD VT_CAREER_CD, A.MNU_GRP_IDX VT_MNU_GRP_IDX, B.HS_POS_CD VT_POS_CD FROM CA_HS A, CA_HS_CAREER B, CA_DEPT C WHERE A.DEL_YN = 'N' AND B.HS_CODE = A.HS_CODE AND B.NOW_YN = 'Y' AND C.DEPT_CODE = B.DEPT_CODE UNION SELECT 'N', VT_BS_CODE, VT_BS_NM, VT_BS_PWD, VT_BS_TEL_NO, VT_BS_CEL_NO, VT_BS_EMAIL_ADDR, VT_SDATE, VT_EDATE, VT_SYS_CODE, VT_SYS_NAME, VT_CAREER_CD, VT_MNU_GRP_IDX, VT_BS_POS_CD FROM VW_CA_BS WHERE TO_CHAR (SYSDATE, 'YYYYMMDD') BETWEEN VT_SDATE AND VT_EDATE;
|
UNION...
그래 회원 정보가 두개로 나눠져 있는건 이해하겠다.
그래서 유니온으로 합치는 거겠지..
근데 시발 VW_CA_BS 이것도 접두사에 vw가 붙은 뷰이다.
VW_CA_BS를 까보자
DROP VIEW CAIS_NEW.VW_CA_BS;
/* Formatted on 2013-11-01 오후 3:44:27 (QP5 v5.115.810.9015) */ CREATE OR REPLACE FORCE VIEW CAIS_NEW.VW_CA_BS ( VT_BS_CODE, VT_BS_NM, VT_BS_CHA_NM, VT_BS_ENG_NM, VT_BS_PWD, VT_SEX_CD, VT_SEX_NAME, VT_BIRTH_DT, VT_SOLRA_CD, VT_SOLRA_NAME, VT_PIC_URL, VT_BS_REGNUM, VT_MAR_CD, VT_MAR_NAME, VT_CPY_CIN_DT, VT_CPY_COUT_DT, VT_BS_POST_NUM, VT_BS_ADDR, VT_BS_ETC_ADDR, VT_BS_BORN_POST_NUM, VT_BS_BORN_ADDR, VT_BS_BORN_ETC_ADDR, VT_BS_TEL_NO, VT_BS_CEL_NO, VT_BS_EMAIL_ADDR, VT_MNU_GRP_IDX, VT_SALARY_BANK_CD, VT_SALARY_ACCNUM, VT_MENO, VT_SDATE, VT_EDATE, VT_SYS_CODE, VT_SYS_NAME, SYS_POS_PLC_IDX, VT_CAREER_CD, VT_CAREER_NM, VT_MGR_YN, VT_BS_PLC_CD, VT_BS_PLC_NM, VT_BS_POS_CD, VT_BS_POS_NM, VT_CAREER_CHG_MEMO, RCD_BS_CODE, RCD_BS_NM ) AS SELECT A.BS_CODE VT_BS_CODE, A.BS_NM VT_BS_NM, A.BS_CHA_NM VT_BS_CHA_NM, A.BS_ENG_NM VT_BS_ENG_NM, A.BS_PWD VT_BS_PWD, A.SEX_CD VT_SEX_CD, (SELECT CODE_NAME FROM CA_COM_CODE WHERE GRPCD_CD = '001' AND CODE_CD = A.SEX_CD) VT_SEX_NAME, A.BIRTH_DT VT_BIRTH_DT, A.SOLRA_CD VT_SOLRA_CD, (SELECT CODE_NAME FROM CA_COM_CODE WHERE GRPCD_CD = '006' AND CODE_CD = A.SOLRA_CD) VT_SOLRA_NAME, A.PIC_URL VT_PIC_URL, A.BS_REGNUM VT_BS_REGNUM, A.MAR_CD VT_MAR_CD, (SELECT CODE_NAME FROM CA_COM_CODE WHERE GRPCD_CD = '115' AND CODE_CD = A.MAR_CD) VT_MAR_NAME, A.CPY_CIN_DT VT_CPY_CIN_DT, A.CPY_COUT_DT VT_CPY_COUT_DT, A.BS_POST_NUM VT_BS_POST_NUM, A.BS_ADDR VT_BS_ADDR, A.BS_ETC_ADDR VT_BS_ETC_ADDR, A.BS_BORN_POST_NUM VT_BS_BORN_POST_NUM, A.BS_BORN_ADDR VT_BS_BORN_ADDR, A.BS_BORN_ETC_ADDR VT_BS_BORN_ETC_ADDR, A.BS_TEL_NO VT_BS_TEL_NO, A.BS_CELL_NO VT_BS_CEL_NO, A.BS_EMAIL_ADDR VT_BS_EMAIL_ADDR, A.MNU_GRP_IDX VT_MNU_GRP_IDX, A.SALARY_BANK_CD VT_SALARY_BANK_CD, A.SALARY_ACCNUM VT_SALARY_ACCNUM, A.MEMO VT_MENO, B.VT_SDATE, B.VT_EDATE, B.VT_SYS_CODE, B.VT_SYS_NAME, B.SYS_POS_PLC_IDX, B.VT_CAREER_CD, B.VT_CAREER_NM, B.VT_MGR_YN, B.VT_BS_PLC_CD, B.VT_BS_PLC_NM, B.VT_BS_POS_CD, B.VT_BS_POS_NM, B.VT_CAREER_CHG_MEMO, A.RCD_BS_CODE, A.RCD_BS_NM FROM CA_BS A, VW_CA_BS_CAREER2 B WHERE B.VT_BS_CODE = A.BS_CODE; |
VW_CA_BS_CAREER2................................또 뷰를 써먹었다
갈때까지 가보자
DROP VIEW CAIS_NEW.VW_CA_BS_CAREER2;
/* Formatted on 2013-11-01 오후 3:45:47 (QP5 v5.115.810.9015) */
CREATE OR REPLACE FORCE VIEW CAIS_NEW.VW_CA_BS_CAREER2
(
VT_BS_CODE,
VT_SDATE,
VT_EDATE,
VT_SYS_CODE,
VT_SYS_NAME,
VT_UP_SYS_CODE,
VT_CAREER_CD,
VT_CAREER_NM,
VT_MGR_YN,
SYS_POS_PLC_IDX,
VT_BS_POS_CD,
VT_BS_POS_NM,
VT_BS_PLC_CD,
VT_BS_PLC_NM,
VT_CAREER_CHG_MEMO
)
AS
SELECT A.BS_CODE VT_BS_CODE,
A.ACT_DT VT_SDATE,
NVL (
(SELECT TO_CHAR (MIN (TO_DATE (X.ACT_DT, 'YYYYMMDD') - 1),
'YYYYMMDD')
FROM CA_BS_CAREER X
WHERE X.BS_CODE = A.BS_CODE AND X.ACT_DT > A.ACT_DT),
'29991231'
)
VT_EDATE,
A.SYS_CODE VT_SYS_CODE,
C.VT_SYS_NAME VT_SYS_NAME,
C.VT_UP_SYS_CODE VT_UP_SYS_CODE,
A.CAREER_CD VT_CAREER_CD,
(SELECT MAX (CODE_NAME)
FROM CA_COM_CODE
WHERE GRPCD_CD = '106' AND CODE_CD = A.CAREER_CD)
VT_CAREER_NM,
A.MGR_YN VT_MGR_YN,
B.SYS_POS_PLC_IDX,
B.BS_POS_CD VT_BS_POS_CD,
(SELECT MAX (CODE_NAME)
FROM CA_COM_CODE
WHERE GRPCD_CD = '105' AND CODE_CD = B.BS_POS_CD)
VT_BS_POS_NM,
B.BS_PLC_CD VT_BS_PLC_CD,
(SELECT MAX (CODE_NAME)
FROM CA_COM_CODE
WHERE GRPCD_CD = '104' AND CODE_CD = B.BS_PLC_CD)
VT_BS_PLC_NM,
A.CAREER_CHG_MEMO VT_CAREER_CHG_MEMO
FROM CA_BS_CAREER A, CA_SYS_POS_PLC B, VW_CA_SYS_HIS2 C
WHERE B.SYS_POS_PLC_IDX = A.SYS_POS_PLC_IDX
AND C.VT_SYS_CODE = A.SYS_CODE
AND A.ACT_DT BETWEEN C.VT_SDATE AND C.VT_EDATE;
VW_CA_SYS_HIS2 이것도 뷰이다. 이젠 놀랍지도 않다.
DROP VIEW CAIS_NEW.VW_CA_SYS_HIS2; /* Formatted on 2013-11-01 오후 3:47:08 (QP5 v5.115.810.9015) */ CREATE OR REPLACE FORCE VIEW CAIS_NEW.VW_CA_SYS_HIS2 ( VT_SYS_CODE, VT_SDATE, VT_CLOS_YN, VT_EDATE, VT_SYS_NAME, VT_SYS_PROPER_NAME, VT_SYSTYPE_CD, VT_SYSTYPE_NM, VT_UP_SYS_CODE, VT_SORT_ORD, VT_SYS_HIS_MEMO ) AS SELECT A.SYS_CODE VT_SYS_CODE, A.ACT_DT VT_SDATE, A.CLOS_YN VT_CLOS_YN, NVL ( (SELECT TO_CHAR (MIN (TO_DATE (X.ACT_DT, 'YYYYMMDD') - 1), 'YYYYMMDD') FROM CA_SYS_HIS X WHERE X.SYS_CODE = A.SYS_CODE AND X.ACT_DT > A.ACT_DT), '29991231' ) VT_EDATE, SYS_NAME VT_SYS_NAME, SYS_PROPER_NAME VT_SYS_PROPER_NAME, SYSTYPE_CD VT_SYSTYPE_CD, (SELECT CODE_NAME FROM CA_COM_CODE WHERE GRPCD_CD = '101' AND CODE_CD = A.SYSTYPE_CD) VT_SYSTYPE_NM, UP_SYS_CODE VT_UP_SYS_CODE, SORT_ORD VT_SORT_ORD, MEMO VT_SYS_HIS_MEMO FROM CA_SYS_HIS A;
|
아따 이것은 뭐시여 CA_SYS_HIS 를 그냥 가져다 쓰면 되는데 왜 뷰를 가져다 썼는지 모르겠다.
로그인하는데 사용한 뷰가 무려 4개에 달한다.
나는 db전문가가 아니라서 이렇게 뷰를 많이 만들어 놓을때 잇점이 무엇인지 잘 모르겠다.
로그인만 봐도 이정도 인데 다른건 뭐 안봐도 비디오다.
새로 구축할때까지 오라클서버나, was가 뒈지지만 않았으면 좋겠다.