생계/MySQL2021. 6. 26. 16:52

 앞선 글에서 가상머신에 우분투를 설치하는 것을 알아보았다.

가상머신 virtualbox mysql 설치 - 1. os 우분투 설치

 

 이번 글에서는 본격적으로 mysql 을 설치해보자. 

 mysql 은 따로 다운 받아서 설치할수도 있지만 cmd 창에서 명령어 한줄이면 된다. 


1. mysql 설치 
 


sudo apt install git

sudo apt-get update
sudo apt-get install mysql-server


sudo systemctl start mysql
sudo systemctl enable mysql

sudo mysql -u root 

 

2. db client tool 설치

이제 디비에 접속하기 위한 툴을 설치해보자.

dbeaver 도 있고 oracle developer 도 있고 암꺼나 써도 되지만 여기서는 workbench 를 쓰겠다. 

workbench 는 아래 다운로드 링크를 따라가면 된다. 

 https://dev.mysql.com/downloads/file/?id=504530
 
c++ 이 필요하다. 아래 링크에서 다운받자.

 https://support.microsoft.com/ko-kr/topic/%EC%A7%80%EC%9B%90%EB%90%98%EB%8A%94-%EC%B5%9C%EC%8B%A0-visual-c-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-2647da03-1eea-4433-9aff-95f26a218cc0

 

지원되는 최신 Visual C++ 다운로드

시간을 최대한 활용하기 위한 구독

support.microsoft.com

 

 

3. db 접속 

 이제 workbench 에서 가상머신 mysql DB 에 접속해보자. 

- db에 외부 아이피 접속 허용

create user root@'%' identified by '1111';
grant all privileges on *.* to root@'%';
flush privileges;

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

my.cnf 수정 => bind-address = 0.0.0.0

- 방화벽 

sudo ufw allow out 3306/tcp
sudo ufw allow in 3306/tcp

 여기까지 했으면 mysql 을 재시작 해보자.

sudo service mysql restart

 
 - workbench 세팅 

 접속을 시도하면... 

 잘된다. 

 

### 에러메세지 별 접속 실패 시 조치 

 ssh 인증 실패 : 계정, 패스워드, 포트 확인해보자 

 

로컬pc 에서 cmd 창을 열어 key 를 다시 만들자

ssh-keygen -R 192.168.56.1

 

ssh 까진 된거다. mysql port 방화벽 확인해보자.

db 로그인 실패 : db계정, 암호, 외부접근 허용 확인 

반응형
Posted by 돌고래트레이너
생계/MySQL2021. 6. 26. 16:49

가상머신에 mysql 을 설치해보자..

예전에는 가상화머신을 vmware 를 많이 썼는데 유료로 바뀌기도 하고 크랙을 찾기도 쉽지않다. 

반면 오라클 virtual box 는 언제 바뀔지 모르겠지만 아직까지는 무료이다.

 

1. 다운로드

- virtual machine download

 https://www.virtualbox.org/wiki/Downloads
 => windows hosts

버추얼박스를 설치할 로컬pc 는 윈도우니까 windows hosts 를 선택 

  설치는 별거 없다. 그냥 next, next... 하면된다. 



- ubuntu linux download
 

  가상머신에는 리눅스를 설치할 예정이니 우분투 이미지를 받자 

 https://ubuntu.com/download
 Ubuntu 20.04.2.0 LTS =>  ubuntu-20.04.2.0-desktop-amd64.iso 



2. virtual machine, 우분투 설치

버추얼머신 에서 새로만들기 -> 버전 에서 64 bit ubuntu 선택 

 

메모리는 2G를, 디스크는 20G 를 할당하

# 리눅스에 64bit 가 안보인다면 bios 세팅 확인 : 가상화 enable

- 우분투 설치 

새로운 머신을 만들었으면 여기에 우분투를 설치하자

설정에서 저장소에서 아까 다운받은 우분투 이미지를 로드하자

 

한국어를 선택하고 설치를 하자. 

 

빠른설치를 위해 최소설치, 업데이트는 제외하자

mysql 을 사용할 user 를 생성

3. ssh client 설치 

가상머신에 리눅스 까지 설치했으면 로컬 터미널에서 ssh 로 붙어서 작업을 하자.

무료 ssh client 중에 putty 가 유명하지만 좀 구리다.

요즘은 mobaxterm 을 많이 쓰는것 같다. 

https://mobaxterm.mobatek.net/download.html
 

- 우분투에 ssh 설치

가상머신 우분투에는 ssh 가 설치되어있어야 한다. 

sudo apt-get install ssh

방화벽에 막혔다면 풀어주자

## sudo ufw allow ssh

- NAT rule

가상머신을 설치하고 ipconfig 명령어를 쳐보면 아래주소가 추가로 생긴다. 

로컬pc 는 가상머신을 저 ip 로 인식하는데 가상머신은 저 주소안에 

여러개의 게스트os 를 둘수가 있다. 

 

이제 가상머신의 ip 확인을 해야 하는데 그전에 아래 명령어를 먼저 쳐준다. 

sudo apt install net-tools

이제 ip 확인을 해보자. 

 

로컬pc 와 가상머신이 통신하려면 아래 같은 추가적인 작업을 해줘야 한다. 

버추얼머신의 설정 -> 네트워크 를 누른다 

 

이제 포트포워드 규칙에 따라서 로컬pc 에서 터미널로 접속할수 있다. 

 

여기까지 가상머신에 우분투 설치를 알아보았다. 

여기에 mysql 설치, 접속 하는 것 까지는 다음 글에서 알아보자. 

가상머신 virtualbox mysql 설치 - 2. mysql 설치 접속
 

 

반응형
Posted by 돌고래트레이너
생계/튜닝2020. 11. 13. 23:12

 

개발자들은 SQL에 업무를 그대로 풀어서 작성하는 경향이 있다. 

그러다보면 where 절에 or 를 자주 사용하게 되는데..

그러나 or 는 DB 가 일 할 범위를 줄여주지 못하고 늘려주기만 할 뿐이라 주의해야 한다. 

 

or 는 in 으로 대체가 가능한 경우가 있는데 옵티마이저가 이를 알아서 바꿔주기도 하지만 

많은 경우에 그러지 못하다. 

이 경우 or 는 filter 처리되어 인덱스를 사용하지 못하고 나중에 처리되며 어떤 경우에는 

모든 조인처리가 끝난 후에 처리 되기도 한다. 

 

 select 

   from xxx

 where a = '1'

   and ( b = '01'  or b = '02' or b = '03' )

 위처럼 작성된 쿼리는 아래로 바꾸는 것이 좋다. 

 select 

   from xxx

 where a = '1'

   and b in ( '01', '02', '03' )

 

 

반응형
Posted by 돌고래트레이너
생계/Oracle2020. 6. 16. 14:43


뷰를 생성하기위해서는 create view 권한이 필요하다. 

자신의 스키마가 아닌 다른 스키마에 뷰를 생성하기 위해서는 create any view 권한이 필요하다. 


1. grant create view

 

2. view vs any view

 

 

 

 ===  1. grant create view ====

 

create user USER_A identified by "q1w2e3r4";

grant resource to USER_A;

grant connect to USER_A;


exit

 

 

sqlplus USER_A/q1w2e3r4

 

create table USER_A.test_tab(a int);

 

Table created.

 

 

create or replace view USER_A.vw_a

as

select '1' a

from USER_A.test_tab

;

ORA-01031: insufficient privileges

 

exit


sqlplus / as sysdba


grant create view to USER_A;

 

exit

 

sqlplus USER_A/q1w2e3r4

 

create or replace view USER_A.vw_a

as

select '1' a

from USER_A.test_tab

;

View created.

 

exit



===  2. grant create any view ====


sqlplus / as sysdba

 

create user USER_B identified by "q1w2e3r4";

grant resource to USER_B;

grant connect to USER_B;

grant create view to USER_B;

grant select on USER_A.test_tab to USER_B;

 

exit

 

sqlplus USER_B/q1w2e3r4

 

create or replace view USER_B.vw_a

as

select '1' a

from USER_A.test_tab

;

View created.

exit

 

sqlplus USER_A/q1w2e3r4

 

create or replace view USER_B.vw_a2

as

select '1' a

from USER_A.test_tab

;

 

ORA-01031: insufficient privileges

 

 

exit


sqlplus / as sysdba


 

grant create any view to USER_A;

 

 

create or replace view USER_B.vw_a2

as

select '1' a

from USER_A.test_tab

;

View created.




 

drop user USER_A cascade;

drop user USER_B cascade;

 



===  3. 뷰 권한 확인  ====



select * from dba_sys_privs where grantee like 'USER%';



반응형
Posted by 돌고래트레이너
생계/Oracle2020. 6. 9. 20:48


테이블에 대한 권한을 role 에 주는 것과 바로 유저에게 주는 것에 차이가 있을까?



ex)  grant select on tabA to roleA  VS  grant select on tabA to userA


두 경우 모두 테이블을 직접 사용하는 것에는 차이가 없다. 


하지만 만약 role 로 부여받은 권한으로 pl/sql 을 작성하려고 하면 에러가 날 것이다. 





==============  테스트 스크립트 =================


-- 1. 테이블 오너 tab_user,  프로시져를 생성할  ddl_user  생성


create user tab_user identified by "q1w2e3r4";

conn tab_user/"q1w2e3r4" 

 

create user ddl_user identified by "q1w2e3r4"; 

conn ddl_user/"q1w2e3r4"

 

grant resource to tab_user;

grant connect to tab_user;

grant resource to ddl_user;

grant connect to ddl_user;

 

alter user tab_user quota 30M on users;

 

-- 2. 프로시저에 쓰일 테스트 테이블, 데이터 생성


create table tab_user.ddltest(

a int

;

 

insert into tab_user.ddltest values(1);

commit;


-- 3. 롤 생성

 

create role test_role;

grant select on tab_user.ddltest to test_role;

grant test_role to ddl_user;

 


sqlplus ddl_user/"q1w2e3r4"

 

select * from tab_user.ddltest;

=> 조회 가능 


-- 4. 테스트 프로시져 생성

 

create or replace procedure ddl_user.test_pcdr

is

 v_msg varchar2(100);

 begin

 

           select a into v_msg

           from tab_user.ddltest;

          

end;

/


=> PL/SQL: ORA-00942 : table or view does not exist


-- 5. 직접 권한 부여 


grant select on tab_user.ddltest to ddl_user;

 

이후에 프로시져를 생성하면 잘 된다. 




## 결론 : 권한관리를 위해 role 오브젝트를 사용하여 개발자에게 권한을 부여하지만

   pl/sql 을 사용하기 위해서는 직접 사용자에게 권한이 주어져야 한다. 


지금 조회되는 테이블이 role 을 부여받아서 조회가 되는건지 다이렉트로 권한을 받아서 되는건지

확인 하고자 할 때는 아래와 같이 하면 된다. 

 


select * from tab_user.ddltest;

 => 조회 가능 


set role none;

 

select * from tab_user.ddltest;

 => ORA-00942


이렇다면 role 로만 권한을 받은 것이다. 



 




반응형

'생계 > Oracle' 카테고리의 다른 글

오라클 라이선스 lifetime support  (0) 2021.08.26
create view , any view 권한  (0) 2020.06.16
DB를 사용한 채번 방식 알아보자  (0) 2020.04.30
오라클 로그인 특수문자 입력  (0) 2020.01.30
권한 확인 SQL  (0) 2019.08.29
Posted by 돌고래트레이너
생계/Oracle2020. 4. 30. 21:16

순차적으로 증가하는 번호를 만드는 방벙에 대해서 알아보자

 

1. 채번테이블

   채번가진 테이블 

   create table chaebun(

    seq number

   constraint primary key (seq) )

     

장점 : 중복 x (pk 제약조건을 걸어놓았다면)

단점 : 성능저하 (채번값수정 ->채번값입력 -> commit) lock, 경합 발생

       관리포인트 증가 


2. 최대값 +1

 insert into  

 select max(seq) +1 from 주문 

 장점 : 빠르다. 채번만을 위한 오브젝트를 따로 만들 필요없어 관리가 용이 

 단점 : 중복가능 (lock 을 사용하지 않는다면)  


3. 시퀀스

오라클에서 제공하는 시퀀스 오브젝트.

 장 : 빠름. lock X, 중복 없음

 단 : 관리항목 증가. 오라클 시퀀스의 특성을 이해하지 못하면 예상치 못한 결과 나올수도 

 

- 시퀀스 오브젝트 생성시 고려 요소 

  : 유일하기만 하면 되는가? => no order, cache

   순서가 반드시 중요한것인가? => order

   중간중간 누락이 되어도 괜찮은가 ? => cache

   재활용 될수 있는가 ?  => cycle

   순서도 보장, 누락도 허용안되 => order, no cache 

 

반응형

'생계 > Oracle' 카테고리의 다른 글

create view , any view 권한  (0) 2020.06.16
ORA-00942 에러 role 에 부여된 권한  (0) 2020.06.09
오라클 로그인 특수문자 입력  (0) 2020.01.30
권한 확인 SQL  (0) 2019.08.29
오라클 like 검색에서 특수문자 사용하기  (0) 2019.06.04
Posted by 돌고래트레이너
생계/SQL2020. 4. 28. 15:47

 아우터 조인은 별거 없으면서도 개발자들이 종종 실수 하는 쿼리 중 하나이다.

 아우터 조인의 개념과 활용을 한번 정리해 보자. 

 

  • 1. 아우터 조인의 개념 
 
   일반 조인은 집합 A 와 B 가 있을 때 양쪽 집합 모두 조인 조건을 만족하는 rows 만 리턴한다. 
 

 

 

   반면, 아웃터 조인은 A 가 기준이라면 A 의 모든 rows 에 대하여

   집합 B 가 조인 조건에 만족하면 나오고 그렇지 않으면 null 을 리턴한다. 

 

   이때 A 와 B 의 관계가 1:1 인 경우, 결과 rows 는 A 의 갯수와 동일하지만 1:N 인 경우는 결과는 N 이 된다.  

 

 
  • 2. 멀티컬럼 아우터 조인 
 
    아우터 조인 조건이 여러개인 것은 하나인 것과 다르지 않다. 
    즉, 조인조건이 '조건1' and '조건2' and '조건3' 이라면 조건을 모두 만족하는 rows 만 결과를 리턴한다. 
    나머지는 null 을 리턴한다. 

 

-- out multi col

 

 

-- multi col outer join 
drop table ot_test1;
drop table ot_test2;

create table ot_test1(
col1 int,
col2 varchar2(1),
col3 varchar2(1),
col4 varchar2(1)
);

create table ot_test2(
col1 int,
col2 varchar2(1),
col3 varchar2(1),
col4 varchar2(1)
);

insert into ot_test1 values('1','a','A','');
insert into ot_test1 values('1','a','B','!');
insert into ot_test1 values('1','b','A','@');
insert into ot_test1 values('2','a','A','#');
insert into ot_test1 values('3','a','A','');

insert into ot_test2 values('1','a','A','G');
insert into ot_test2 values('1','a','A','X');
insert into ot_test2 values('1','b','A','F');

 

select a.col1 a1, a.col2 a2, a.col3 a3, b.col4
  from ot_test1 a,
       ot_test2 b
where 1=1
and a.col1 = b.col1(+)
and a.col2 = b.col2(+)
and a.col3 = b.col3(+)
;

 

 

 

 

 

 

집합 A 에 5 개 rows 를 넣었고 집합 B 에는 3 개의 rows 를 넣었다.

아우터의 기준이 되는 A 의 5 개는 모두 나온다.

col1=1 col2=a col3=A 인 조인조건을 만족하는 B 집합이 2개가 모두 리턴된다.   

 

 

## 아우터 조인은 1:1 관계 에서는 스칼라 서브쿼리로 변경 가능하다. 

 

select a.col1 a1, a.col2 a2, a.col3 a3,
      (select b.col4
         from ot_test2 b
        where 1=1
          and a.col1 = b.col1
          and a.col2 = b.col2
          and a.col3 = b.col3
      ) b4
 from ot_test1 a
order by a1, a2, a3
;
=> ORA-001427

 

1:1 관계가 아닌 아우터 조인을 스칼라 서브쿼리로 변경하면 ORA-001427 가 뜬다.

 

이때 min, max 등의 그룹함수를 사용하면 에러를 회피할 수 있다.

 

select a.col1 a1, a.col2 a2, a.col3 a3,
      (select min(b.col4) 
         from ot_test2 b
         where 1=1
        and a.col1 = b.col1
        and a.col2 = b.col2
        and a.col3 = b.col3
      ) b4
  from ot_test1 a
order by a1, a2, a3
;
=> 스칼라서브쿼리에서 2개 이상의 행이 리턴되는 것을 막기 위해 min 함수를 썼다.

 

  • 3. 연속 아우터 조인
 
중첩해서 아우터 조인을 사용할 경우도 있다.
 
이럴때는 어디에 (+) 를 표시해야 할까.

 

-- consecutive out join

drop table out_a;
drop table out_b;
drop table out_c;

create table out_a(
col1 int,
col2 varchar2(1)
);

create table out_b(
col1 int,
col2 varchar2(1)
);

create table out_c(
col1 int,
col2 varchar2(1)
);

insert into out_a values(1,'a');
insert into out_a values(2,'b');
insert into out_a values(3,'G');
insert into out_a values(4,'');

insert into out_b values(1,'a');
insert into out_b values(3,'');
insert into out_b values(5,'');
insert into out_b values(6,'d');

insert into out_c values(1,'a');
insert into out_c values(2,'a');
insert into out_c values(3,'c');
insert into out_c values(3,'f');
insert into out_c values(6,'a');

 

 

-- 올바른 중첩 아우터 조인 쿼리 

 

SELECT *
FROM OUT_A A
     ,OUT_B B
     ,OUT_C C
WHERE A.COL1 = B.COL1(+)
AND B.COL1 = C.COL1(+)
ORDER BY A.COL1
;

 

 

 

-- 잘못 작성된 아우터 조인 

 

SELECT *
  FROM OUT_A A
      ,OUT_B B
      ,OUT_C C
 WHERE A.COL1 = B.COL1(+)
   AND B.COL1 = C.COL1
ORDER BY A.COL1
;

 

 

 

 이것의 결과는  일반조인의 결과와 같다. 

 

-- 일반적인 조인  

 

SELECT *
  FROM OUT_A A
      ,OUT_B B
      ,OUT_C C
 WHERE A.COL1 = B.COL1
   AND B.COL1 = C.COL1
ORDER BY A.COL1
;

 

 

 

## A = B(+)  and B(+) = C 이런 아우터 조인은 가능할까?

 

 -- 이런 아우터 조인이 될까 

SELECT *
  FROM OUT_A A
      ,OUT_B B
      ,OUT_C C
 WHERE A.COL1 = B.COL1(+)
   AND B.COL1 (+) = C.COL1
ORDER BY A.COL1
=> 이 결과는 A 와 B 의 아우터 조인 집합과 C의 카티션 곱이다. 

 

  •  4. Full outer join  

오라클은 아우터 조인되는 집합쪽에 (+) 기호를 넣는다. 

그렇다면 양쪽 아우터 조인은 양쪽 집합에 (+) 를 넣으면 될것 같은데 그렇게 하면 에러가 난다. 

 

full outer join 은 ansi 방식으로 작성하거나 왼쪽 아우터 조인 오른쪽 아우터 조인을 union 하는 방식으로 쓸수 있다. 

 

 

--  FULL OUTER JOIN

drop table out_a;
drop table out_b;

create table out_a(
col1 int,
col2 varchar2(1)
);

create table out_b(
col1 int,
col2 varchar2(1)
);

insert into out_a values(1,'a');
insert into out_a values(3,'c');
insert into out_a values(5,'');

insert into out_b values(1,'a');
insert into out_b values(4,'%');
insert into out_b values(5,'$');

 

-- 일반조인


SELECT A.COL1, B.COL1, A.COL2, B.COL2
  FROM out_a A,
       out_b B
 WHERE A.COL1 = B.COL1
;

 

 

 

 

-- 맞지않는 문법

 
SELECT A.COL1, B.COL1, A.COL2, B.COL2
  FROM out_a A,
       out_b B
 WHERE A.COL1(+) = B.COL1(+)
;
=> ORA-01468

 

 

 

-- ansi 


SELECT A.COL1, B.COL1, A.COL2, B.COL2
  FROM out_a A full outer join out_b B
    ON A.COL1 = B.COL1
ORDER BY a.COL1
;

 

 

 

 

 

 

 

 

 

 

-- union


SELECT A.COL1, B.COL1, A.COL2, B.COL2
  FROM out_a A,
     out_b B
 WHERE A.COL1 = B.COL1(+)
UNION
SELECT A.COL1, B.COL1, A.COL2, B.COL2
  FROM out_a A,
       out_b B
 WHERE A.COL1(+) = B.COL1
;

 

 

 

 

  •  5. Lateral outer join  

 Lateral 구문은 오라클에서 좀 더 유연하게 아우터 조인을 사용하는 것을 지원한다.

 오라클 아우터 조인은 조인 조건에 in 이나 or 가 올 경우 에러가 난다. 

SELECT A.EMPNO, B.DNAME
  FROM EMP A,
             DEPT B
 WHERE A.DEPTNO = B.DEPTNO(+) OR A.DEPTNO = B.DEPTNO2(+)

 => 에러 

 위의 SQL 은 아래와 같이 or 조건을 union 으로 분리해서 작성해야 정상 동작한다. 

SELECT A.EMPNO, B.DNAME
  FROM EMP A,
    DEPT B
 WHERE A.DEPTNO = B.DEPTNO(+) 
UNION 
SELECT A.EMPNO, B.DNAME
  FROM EMP A,
    DEPT B
 WHERE A.DEPTNO = B.DEPTNO2(+)

해당 SQL은 lateral 을 사용하면 좀 더 간결하게 작성할수 있다. 

SELECT A.EMPNO, B.DNAME
  FROM EMP A 
           , LATERAL (
                     SELECT B.DNAME
                         FROM DEPT B
                     WHERE A.DEPTNO = B.DEPTNO OR A.DEPTNO = B.DEPTNO2 
    ) (+)B

 

 

 

도움이 되셨다면 "공감" 마구 눌러주세요

반응형

'생계 > SQL' 카테고리의 다른 글

[oracle]프로시져 out 파라미터 호출하기  (0) 2022.07.13
transaction isolation level  (0) 2021.07.16
sql 튜닝 트레이스  (0) 2019.10.21
서브쿼리에 대해서 알아보자  (0) 2019.06.06
Posted by 돌고래트레이너
생계/DA2020. 1. 30. 14:49


데이터 표준화 관련 용어, 단어, 도메인, 코드에 대해 정리해보자 

1. 용어 
 종류 : 업무/비표준전문/표준 용어 
  - 업무용어 : 화면등 label 용. 길이 x
  - 비표준전문 : 전문처리용. 길이포함. 
  - 표준용어 : 테이블 컬럼용. 

2. 단어 
 1) 단일어

 한음절 단어는 되도록 표준에서 제외하는 것이 좋다. ex) 회식 + 비(x) ,  회식 + 비용(O)

 예외적으로 허용해야하는 경우는 복합어로 만드는 것이 낫다.  ex) 회식 + 비(x) , 회식비(O)

 2) 복합어 
   - 합성어
   - 파생어

단어 + 단어 로 구성된 단어가 각각의 단어에서 의미가 유추되지 않으면 복합어로 구성이 낫다 

 3) 기타
  관용어, 외래어 
  금칙어/유사어
  동음이의/ 이음동의

 3. 도메인, 인포타입 ( 코드/번호/그룹) 

 - 도메인
도메인은 속성이 가질 수 있는 값의 범위
특정 데이터 필드에 허용되는 값의 집합을 정의

- 인포타입
인포타입은 도메인에 대한 구체적인 데이터 타입과 길이를 지정한 것
ex) 일자 도메인 : Varchar(8) 또는 Date 인포타입을 선택
  계좌 번호 속성:  'VC12' (12자리 가변 문자열) 인포타입을 지정
  

 4. 코드 
 - 코드란 무엇인가 : 속성의 값을 기호로 변환한 것
 - 필요성 :  프로그램 소스코드 수준에서 로직분기, 데이터를 유형화하여 조회, 
            짧게 압축 => 가독성, 저장공간 효율성.  
         본질은 분류, 범주화의 도구 
  - 코드인 것과 아닌 것 (상품코드 vs 상품번호) 
  - 코드 종류 : 
 공통코드 : 시스템 전반에 걸쳐 공통적으로 사용되는 코드
 일반적으로 공통코드 테이블에서 통합 관리
 코드와 코드값만으로 서비스가 가능한 경우에 사용
 개별코드 : 특정 업무 영역이나 테이블에서 개별적으로 정의되고 관리되는 코드
   코드와 코드값 외에 추가적인 정보가 필요한 경우 사용
 외부코드 : 외부코드는 외부 기관이나 표준에 의해 정의되어 사용되는 코드
   시스템 간 호환성을 위해 외부에서 정의된 코드를 그대로 사용
 
 * 식별자와 코드를 구분하기. 

  PD001, PD002 => 상품번호, 
  저축성, 연금성.. => 상품코드(범주로 분류)

[부서코드]  => [부서]
#부서코드  => #부서번호 (* 식별자)
부서장id     => 부서장id
부서구분    => 부서유형코드 (*코드)

 

데이터표준화는 업무적으로 협의하기에 따른 부분이 많기에 그냥 이렇게 정리해볼수 있다는 걸로만 알아두자.

반응형

'생계 > DA' 카테고리의 다른 글

RDBMS 에서의 관계 라는 것  (0) 2023.12.12
이력 모델  (0) 2023.12.09
엔터티 통합과 분리  (0) 2023.12.09
엔터티 유형 분류  (0) 2023.11.29
논리 데이터 모델링 절차  (0) 2021.10.16
Posted by 돌고래트레이너
생계/Oracle2020. 1. 30. 14:47

오라클 로그인 시 특수문자를 입력하는 방법에 대해서 알아보자

아래 같은 DB 계정을 생성한다고 가정.

ID / password :   test / qwer!@#$

 => create user test identified by "qwer!@#$";

 

1. golden, toad 같은 client tool 에서 로긴

  - 특수문자를 넣는다고 해서 달라질게 없다. 변동 무

 

2. sqlplus 로긴

     

  - 다른 유저로 로긴 후  conn 으로 변경시

    => 비밀번호 를 쌍따옴표로 감싸기

     sqlplus / as sysdba

      conn  test/"qwer!@#$"

  - sqlplus 로 바로 접속시 

   => 패스워드부분을 쌍따옴표로 감싸고 @,쌍따옴표 앞에 역슬래쉬(\) 를 붙인다. 

  sqlplus test/\"qwer!\@#$\"

 


  

 특수문자 @ 는 오라클에서 디비를 식별할때 쓰기 때문에 sqlplus 명령에서 쓰려면

  위와같은 조치를 해줘야 한다. 

반응형
Posted by 돌고래트레이너
생계/튜닝2019. 11. 1. 15:03

 

A 라는 집합에서 B 테이블의 b1 조합 제외, b2 조합 제외


SELECT *

  FROM A

WHERE ...

   AND NOT (     (A.COL1, A.COL2) IN ( SELECT 

                                                     FROM B

                                                     WHERE ... )

                   OR  (A.COL1, A.COL3) IN ( SELECT 

                                                       FROM B

                                                       WHERE ... )

                  )


위 구조의 문제점


 개발자들은 SQL 에 업무를 그냥 서술하는 경향이 있다. 

 위의 쿼리는 NOT IN 절에 조건을 계속 추가하는 식으로 작성이 되어있어서

A 의 조건을 만족하는 모든 ROW 에 대해서 NOT IN 절을 확인하게 되었있다. 


NOT IN 절을 바꿔보자


AND NOT ((A.COL1, A.COL2, A.COL3) IN ( SELECT B.COL1

                                ,DECODE(RN,1,B.COL2, A.COL2)

                        ,DECODE(RN,1,A.COL3, B.COL3)

                                                        FROM B,

                        ( SELECT ROWNUM RN

                                     FROM ALL_OBJECTS

                           WHERE ROWNUM <=2

                                                                 )BB

                                                         WHERE ... 

                         )

                  )



조건에 따라서 COL1, COL2 또는 COL1,COL3 와 가공의 컬럼 RN 을 만들고 카티션 조인을 한다.


RN=1 인 경우 원본의 첫번째 NOT IN 이 되고 

RN=2 인 경우 원본의 두번째 NOT IN 이 된다. 


EX) RN=1    AND NOT ((A.COL1, A.COL2, A.COL3) IN ( B.COL1, B.COL2, A.COL3 )

    RN=2    AND NOT ((A.COL1, A.COL2, A.COL3) IN ( B.COL1, A.COL2, B.COL3 )


 가 된다. 







반응형
Posted by 돌고래트레이너