오류 : CLIENT_PLUGIN_AUTH is required

원인 : 원인이 몇 가지 있으나 나는 mysql-connector 버전이 맞지 않는 경우에 해당. 기존에 사용하던 connector는 mysql-connector-8.2버전(최신)이었으나 오래된 현 회사 시스템에는 맞지 않는 connector였음.

해결 : mysqlconnctor-5버전대로 낮추고 진행

Posted by 知彼知己百戰不殆
,

key를 ident 값으로 주는게 있었고, 양쪽 테이블을 동일하게 맞춰났다. 하지만 프로시저에서 로직 오류가 있어서 사용하다 보니 어느 순간 두 테이블의 ident 값이 틀어져 있었고, key값으로 비교 시 이상하게 비교가 되었다.

필요: dbcc checkident(테이블명, noreseed) 는 현재 테이블의 ident 값을 가져오는 것이지만 if문에서 양쪽 값 비교 필요

해결: select IDENT_CURRENT(테이블명) 으로 하면 현재 테이블의 ident 값을 select로 가져올 수 있음

Posted by 知彼知己百戰不殆
,

데이터 양이 매우 많은 테이블들이 여러개 조인되고 그 안에서 조건을 넣어 조인을 하다 보면 SQL 속도가 상당히 느려짐.

이 때 임시 테이블이나 신규로 통계 데이터를 저장하는 테이블을 만들어서 작업 외 시간에 해당 테이블에 저장을 미리 시킨 후 해당 쿼리 결과가 필요할 땐 신규 테이블에서 값을 가져와서 보여주는 형태로 하면 빠름.

단점 : 실시간 확인해야 하는 통계 SQL에는 적용하기 힘듦. 이 땐 SQL 튜닝이나 다른 방법을 찾아야 함

Posted by 知彼知己百戰不殆
,

Table A (group by 한 값들이 모두 들어있는 테이블)
select '1' from dual union all
select '2' from dual union all
select '3' from dual union all
select '4' from dual union all

Table B (실제 값 가져오는 쿼리)

이런 식으로 group by 했을 때 무조건 나와서 통계 표와 맞춰야 하는 값들 강제 작성 후 left join 

Posted by 知彼知己百戰不殆
,

변동값을 group by 하는 tip

예를 들어 각 나이대별 00 건수 데이터를 뽑고 싶을 때

구분 5년이상 10년이하 10년이상 15년이하 15년이상 20년이하 ~~~
20세 ~ 30세        
30세 ~ 40세        
40세~ 80세        
         

위와 같은 표의 데이터를 뽑을 때 처음에 어떻게 데이터를 뽑아야 할지 머리가 안 돌아갔다.
구분값이 다 변동값인데 이걸 어떻게 group by로 뽑아내지 하다가 문득 든 생각 

20세와 30세를 그룹으로 묶고 30세~40세를 그룹으로 묶어 버리자.

그래서 gruop by를 하기 전 case when 컬럼1 between 20 and 30 then '1'
when 컬럼1 between 30 and 40 then '2' 
...

이런 방식으로 그룹핑을 지어주었다. 그리고 또한 기간도 case when 컬럼2 between 5년 between 10년 then '1'
when 컬럼2 between 10년 and 15년 then '2'

이렇게 변동값을 그룹으로 한정해버리고 쿼리 추출!!

쿼리는 항상 너무 어렵다 ㅠㅠ

Posted by 知彼知己百戰不殆
,

A조건 : 건수
B조건 : 건수
C조건 : 건수

위와 같이 각 조건별로 건수를 한 방에 출력하고 싶을 때 

select count(case when ~~~~ then 1 end ) as column1
        , count(case when ~~~~ then 1 end ) as column2  
        , count(case when ~~~~ then 1 end ) as column3
  from 테이블명

Posted by 知彼知己百戰不殆
,

0원 초과 1만원 미만 데이터를 구하고 싶은데 >, <를 쓰자니 쿼리가 길어질 거 같고 간단한 건 뭐 없을까 고민하다가 검색

NOT BETWEEN A AND B
=> A 미만 B 초과  

Posted by 知彼知己百戰不殆
,

빨간 박스부분(Agent 부분)이 활성화 되어있지 않다면 

SQL Server 관리자메뉴에 들어가서 빨간 네모박스 서비스를 수동 실행해야 함

Posted by 知彼知己百戰不殆
,

SQL Server 프로시저는 아래와 같은 방식으로 생성.
프로시저 실행은 EXEC DB명.스키마명.프로시저명

CREATE PROCEDURE 프로시저명 
AS
BEGIN
SET NOCOUNT ON; --프로시저 성능향상

DECLARE @VIRABLE Table (
          REG_EMP_NO          CHAR(10)  DEFAULT '604411'
)

BEGIN TRY
   INSERT INTO @VIRABLE (REG_EMP_NO)
   select EMP_NO  from openquery(DB Link명,'오라클 쿼리')
END TRY
BEGIN CATCH
   오류났을 때 insert든, 뭔가 처리할 쿼리
END CATCH

END

 

P.S : try-catch는 굳이 안 써도 상관없음. 난 그냥 내가 오류났을 때 빠른 대처를 위해 로직 작성하느라 저렇게 한 것

Posted by 知彼知己百戰不殆
,

테스트 환경을 구축해놓고 공부하는 기타 다른 블로그들을 보며 일주일간 삽질을 했기에..ㅠㅠ 이번 기회에 정리.
이번에 다시 느낀 건 역시 블로그 보단 공식 사이트가 진리다...

신규 업무를 위해 신규 DB서버 구축이 필요했는데, SQL Server를 사용해야 함.

요구사항
1. 본점 Oracle DB 연결(Linked Server)
2. 매일 정해진 시간에 자동으로 00 발송
3. SQL Server 2019 사용

DB Link 전 필수사항
1. Oracle 11g 설치(DB instance는 불필요해서 software만 설치)
2. ODBC 설치 후 시스템 DSN 생성(불필요한 것 같음. 현재 Linked Server로 연결된 이름은 모두 TNS이름이랑 맞췄고 ODBC로 설정된 이름은 다름, 기타 블로그에서 만들라고 해서 만들었으나 추후 확인)
3. tnsnames.ora 파일 설정

DB Link 설정
1. Server Objects(서버개체) 마우스 우클릭 - New - Linked Server... 선택
2. Linked Server 설정

OK 버튼을 누르면 자동으로 연결 테스트가 진행됨

3. 연결 테스트 성공 후 DB 셀렉트 테스트
select * from openquery(DB Link명, 'select 1 from dual'); 
Oracle 연결 테스트이기 때문에 위처럼 테스트를 진행
Openquery를 사용하지 않고 스키마처럼 .으로 진행하는 방식도 있으나 성능이 떨어짐(테이블의 모든 데이터를 가져온 후 조건 필터링하기 때문) openquery는 링크된 db에서 필터링 후 데이터 가져옴

'데이터베이스' 카테고리의 다른 글

Oracle ~~초과 ~~ 미만 구하기  (0) 2024.01.10
SQL Server Job 스케줄러 생성  (0) 2023.12.26
SQL Server 프로시저 만들기  (0) 2023.12.26
sql Developer 필수 정보 및 환경설정  (0) 2021.08.12
MySql SqlDeveloper 연결  (0) 2021.08.07
Posted by 知彼知己百戰不殆
,