Step 1. 기존 DBeaver 환경설정 파일 백업

DBeaver 기본 환경설정 파일은 AppData 쪽에 있다! 일단 윈도우 탐색기를 열어보자.
내 컴퓨터를 열어도되고, Win + E 키를 눌러 열어도 된다.
창이 열리면 주소창에 %AppData% 를 입력하고 엔터!
 
%AppData%

 

그럼 DBeaver가 설치된 PC라면 아래와 같이 DBeaverData 디렉토리를 확인할 수 있다. 통째로 복사하자.

 

 Step 2. 새로운 환경 PC에 환경설정 파일 복구

옮겨진 환경에서 %AppData% 경로로 다시 들어가서 Step 1 에서 복사한 디렉토리를 그대로 붙여넣자.
 
%AppData%

 

 

 

 

아래와 같이 붙여넣기를 했다면 DBeaver를 설치하면 거의 다 끝!

 
 
 

 Step 3. DBeaver 설정 및 확인

DBeaver 설치까지 완료했다면
파일 > 작업공간 전환 > 기타 클릭!

 
찾아보기 클릭 > DBeaverData 경로 지정

 
※ 아래 캡쳐에서 General, General2는 DBeaver에서 실제 표시되는 디렉토리로 해당 디렉토리의 바로 한단계 상위 디렉토리까지 지정해주면 됨. 즉, 아래 캡쳐 예시에서는 workspace6까지 지정을 해주면된다. 

 

Launch 클릭!

 

그럼 아래와 같이 복구 된 것을 확인할 수 있다.

 

 

 

출처 :  https://closed0402.tistory.com/131

 

SUBSTRING : SUBSTR 가능

12345678의 5번째부터 끝까지 문자열을 추출합니다.

SELECT SUBSTRING( '12345678', 5 );
+----------------------------+
| SUBSTRING( '12345678', 5 ) |
+----------------------------+
| 5678 |
+----------------------------+
SELECT SUBSTRING( '12345678' FROM 5 );
+--------------------------------+
| SUBSTRING( '12345678' FROM 5 ) |
+--------------------------------+
| 5678 |
+--------------------------------+

12345678의 5번째부터 2개의 문자열을 추출합니다.

SELECT SUBSTRING( '12345678', 5, 2 );
+-------------------------------+
| SUBSTRING( '12345678', 5, 2 ) |
+-------------------------------+
| 56 |
+-------------------------------+
SELECT SUBSTRING( '12345678' FROM 5 FOR 2 );
+--------------------------------------+
| SUBSTRING( '12345678' FROM 5 FOR 2 ) |
+--------------------------------------+
| 56 |
+--------------------------------------+

추출할 문자열의 개수가 모자르면 가능한만큼만 추출합니다.

SELECT SUBSTRING( '12345678', 5, 10 );
+--------------------------------+
| SUBSTRING( '12345678', 5, 10 ) |
+--------------------------------+
| 5678 |
+--------------------------------+

SUBSTRING_INDEX

SUBSTRING_INDEX( string, delimiter, count )

12.34.56.78을 .으로 구분하면 4개의 문자열이 나오는데, 그 중 앞에서 3개를 추출합니다.

MariaDB [(none)]> SELECT SUBSTRING_INDEX( '12.34.56.78', '.', 3 );
+------------------------------------------+
| SUBSTRING_INDEX( '12.34.56.78', '.', 3 ) |
+------------------------------------------+
| 12.34.56 |
+------------------------------------------+

음수인 경우 뒤쪽에서 추출합니다.

MariaDB [(none)]> SELECT SUBSTRING_INDEX( '12.34.56.78', '.', -2 );
+-------------------------------------------+
| SUBSTRING_INDEX( '12.34.56.78', '.', -2 ) |
+-------------------------------------------+
| 56.78 |
+-------------------------------------------+

 

출철 : https://www.codingfactory.net/12501

DB에 접속해서 작업을 할 때, DBeaver라는 무료 프로그램을 많이 사용하게 됩니다. 이 프로그램을 사용해서 Oracle, MSSQL, PPAS에 연결하여 사용하는 법을 알아볼게요!!

 

 DBeaver 설치하는 방법

DB 관리 툴로 예전에는 Toad, Orange를 많이 사용했는데 라이선스가 필요하기 때문에 저처럼 프로젝트를 많이 옮겨 다니는 경우에는 바로 무료 툴을 받아 설치해서 사용하는 게 편하더라고요. 일단 설치부터 고고.

 

구글에 DBeaver를 검색하면 다운로드 페이지가 맨 위에 뜹니다.

Download 클릭해 들어가서 본인에게 필요한 OS 버전을 다운로드하여 설치하시면 끝입니다.

 

구글에서 DBeaver 검색하여 다운로드 받기

 

 DBeaver로 DB 접속하기

예전에는 별도의 드라이버 설치 필요 없이, DB정보만 입력하고 방화벽만 뚫려 있으면 바로 접속이 되었던 것 같은데, 최근에 여러 프로젝트에서 새로 깔아 해보려니 드라이버를 따로 설정해줘야 하더라고요.

 

물론 드라이버 다운로드하겠느냐는 페이지가 뜨는데 접속이 되지 않거나 계속 오류가 표시되는 문제가 있었습니다.

 

결론은 디비의 종류마다 맞는 odbc 라이브러리를 구해줘서 라이브러리 패스에 추가해줘야 정상적으로 연결이 됩니다.

 

 

 오라클 접속하기

처음에 커넥션을 만드는 템플릿에서 오라클을 선택합니다. IP, Port, DB SID, Username, Password 정보를 입력하고 왼쪽 하단의 Test Connection을 클릭했을 때 정상적으로 연결이 되면 성공인데요, 잘 되지 않으면 드라이버를 다시 세팅해줘야 합니다.

 

우측 하단의 Edit Driver Settings를 클릭하고 들어갑니다. Library탭으로 이동하여 기존에 있던 세팅 값을 다 지우고 "Add File"버튼을 눌러 odbc 라이브러리 파일을 추가합니다. 저의 경우 ojdbc8.jar를 넣으니 정상적으로 동작했습니다.

 

DBeaver 드라이버 세팅 변경하기

 

 

 

 

 MSSQL 연결하기

이번 프로젝트에는 디비 종류도 참 다양합니다. 보통 오라클 MSSQL 정도인데, 이번엔 Postgre계열인 PAAS 디비까지 있습니다. 써본 적도 없는 디비인데, 여하튼 일단 MSSQL 먼저 도전합니다.

 

일단 연결 템플릿에서  SQLServer를 선택합니다. 연결 정보 세팅 후 Test Connection을 눌렀지만 역시나 바로 되지 않네요. Edit Driver Settings를 클릭하여 들어갑니다.

 

아까와 동일하게 라이브러리 탭으로 이동하여 기존 정보를 지우고 sql 라이브러리를 설정해줍니다. 저는 라이브러리가 없어서 구글에서 검색해서 다운로드하였습니다. 압축파일로 되어 있는데, 압축을 풀고 보시면 자바 버전별로 라이브러리가 제공되어 있습니다. 저는 8 버전의 라이브러리를 설정했더니 연결이 문제없이 되었습니다.

 

MSSQL jdbc드라이버 다운로드

 

 PPAS 연결하기

 

PostgreSQL과 PPA의 다른 점은?!

PostgreSQL은 EnterpriseDB 사에서 제공하는 무료 데이터베이스입니다. 오픈소스이며 확장성 및 표준 준수를 강조하는 객체-관계형 데이터베이스로 최근 많이 사용되는 추세이죠.

 

피파스라고 부르는 PPAS는 Postgres Plus Advanced Server의 약자로 PostgreSQL 기반이면서 오라클의 사용법을 그대로 사용할 수 있는 장점이 있는 디비입니다. 또한 오라클 기반으로 사용하는 애플리케이션을 실행할 수 있다는 것이 큰 강점이죠.

 

따라서 오라클이 비싸기 때문에 PPAS로 마이그레이션 하여 더 저렴하게 시스템을 연동할 수 있는 매우 큰 장점을 가지고 있어서 요즘 사용들을 많이 합니다.

 

그래서 그런지 지금 프로젝트에도 PPAS가 등장했네요. 처음 연결해봅니다. 두근두근..

 

 

DBeaver에서 PPAS 연결해보기

 

포스트그레 기반이니까, 템플릿을 포스트그레로 선택했습니다. 연결 정보 입력하고.. 연결 테스트. 역시 안됩니다. 얘는 PostgreSQL의 라이브러리를 넣어 놓아도 실행이 안됩니다. PPAS용 jdbc 라이브러리를 찾아야겠죠. 구글링을 해보니 라이브러리 파일 명이 edb-jdbc18.jar라고 합니다.

 

라이브러리를 못 찾아서 프로젝트 공유서버에 edb라고 쳐서 검색했더니 나왔습니다. PPAS를 깔고 나면 그 드라이브 뒤져보면 있다고 하니 그렇게 구하시면 될 듯합니다.

 

 

아까 했던 방법과 마찬가지로 Edit Driver Settings 버튼을 눌러 라이브러리를 기존에 있던 것 지우고 edb-jdbc18.jar를 넣었습니다. 그런데.. 연결이 안 됩니다!! 흙 ㅠㅠ 알고 보니 PostgreSQL의 템플릿을 사용했기 때문에 클래스 명과 URL이 다르게 되어 있기 때문이었네요.

 

PPAS 용 클래스 명은 com.edb.Driver이며 jdbc:edb://localhost:5444/edb 이런 식으로 jdbc url도 다릅니다. 다시 드라이버 세팅으로 들어가서 Setting 탭에 클래스 이름과 URL 템플릿을 변경해주었고 연결에 성공했습니다!!

 

 

PPAS에 연결하기 위해 세팅 변경하기

 

여기까지  DBeaver를 사용해서 오라클, MSSQL, PPAS에 연결하는 방법을 알아보았습니다.

 

출처: by 모아모아뇽 2021. 7. 7.

일반적으로 MSSQL 은 데이터 파일 MDF / 로그 파일 ( 트랜잭션 ) LDF 로 나뉘어 집니다.

간혹가다 LDF 파일의 용량이 너무 늘어나 디스크 용량을 다 사용하게되어 장애가 나는 상황이 발생합니다.

이러한 상황이 오지 않게 하기 위해서는 주기적인 LDF 파일을 관리해주어야 합니다.

1. 로그파일 확인 (MB)

DBCC SQLPERF(LOGSPACE)

또는

EXEC SP_HELPFILE

2. 로그 파일 용량 줄이는 방법

-- Database Log 축소 작업

BACKUP LOG [Database] WITH TRUNCATE_ONLY

-- Database Log 삭제

BACKUP LOG [Database] WITH NO_LOG

-- Database 축소 작업 ( 파일 축소 작업 )

DBCC SHRINKFILE (DB파일,10)

DBCC SHRINKFILE (DB_LOG파일,10)

간혹 해당 작업을 해도 LDF 파일이 줄어들지 않는 경우가 있습니다.

그럴땐 SSMS 를 활용하여 간편하게 줄일 수 있습니다.

1. 해당 데이터베이스 속성 클릭

2. 데이터베이스 복구모델 단순 (SIMPLE) 로 변환

3. 축소작업 진행

[출처] MSSQL MDF, LDF SHRINK 파일 용량 줄이기

 

저장 프로시저(stored procedure) 안에서 다른 저장 프로시저를 호출하려면 크게 보자면 2가지 방법이 있습니다.
Exec(EXECUTE)나 sp_executesql를 이용하면 됩니다.
( 참고 : MSDN - sp_executesql 사용)

 

여기서는 Exec(EXECUTE)를 이용하는 방법을 설명하겠습니다.

1. 리턴값이 없을 때

리턴값이 없으면 그냥 호출하면 됩니다.

 

--Exec [저장프로시저 이름]
--Exec [저장프로시저 이름] [매개변수1],[매개변수2],....
Exec TestSelect @temp

 

 

2. 리턴값이 있을 때

 

리턴값은 항상 int형이므로 인티저형의 변수를 하나 선언한 후 값을 대입하는 방식으로 받습니다.

 

--Exec [값을 받을 변수] = [저장프로시저 이름] [매개변수1],[매개변수2],....
Declare @nTemp int
Exec @nTemp = TestSelect @temp

 

3. 셀랙트(Select)값이 있을 때

셀랙트로 값을 받아올 때는 임시테이블이나 테이블 변수를 사용하면 됩니다.
임시테이블보다는 테이블 변수를 사용한 방법이 좋습니다.
( 참고 : [MSSQL] 저장프로시저에서 테이블(Table) 변수 사용하기 )

이런 식으로 셀랙트 값을 받을 수 있습니다.

 

--임시테이블
Declare @tableTemp table
	( sTemp varchar(32))
Insert @tableTemp exec [저장프로시저 이름] [매개변수1],[매개변수2]

 

 
 

 

[출처] : blog.danggun.net/1255

 

 

========================================

-- 1번 프로시져
CREATE PROCEDURE dbo.P_Stat (
  @IN_X_Seq  int
  ,@OP_A varchar(10) OUTPUT
  ,@OP_B int OUTPUT
)
AS
Begin

  SET @OP_A = 'test'
  SET @OP_B = 5
  RETURN
End
GO

========================================
-- 2번 프로시져. 1번을 호출
CREATE PROCEDURE dbo.P_Order (
  @IN_X_Seq  int
)
AS
Begin
 Declare  @OP_A varchar(10)
 Declare @OP_B int

 -- 프로시져를 실행해서 반환값을 반환받습니다.
 --실행하실때 output 데이터를 받을 변수를 같이 넣어주시면 됩니다.
 --그리고 담아진 변수값을 print로 찍어보시면 되구요.

 EXEC P_Stat @IN_X_Seq = @IN_X_Seq , @OP_A output, @OP_B output

 print @OP_A

 print @OP_B

End
GO

 

[출처] blog.naver.com/idtong/130071970020

-- 값에서 검색값의 시작위치를 반환

oracle : select instr('달력1,달력2,달력3', ',', 1) from dual; ----> 4를 반환

mssql : select charindex(',', '달력1,달력2,달력3') ----> 4를 반환

-- 조건 비교 후 처리시

oracle : decode(조건, true값, false값)

mssql : case when 조건 then true값 else false값 end

-- 현재일에서 1달 뒤 구하기

oracle : SELECT ADD_MONTHS(SYSDATE, 1) FROM DUAL;

mssql : SELECT DATEADD(mm, 1, GETDATE())

-- 날짜로 변환

oracle : SELECT TO_DATE('202005' || '01','YYYYMMDD' ) FROM DUAL;

mssql : SELECT CAST('202005' + '01' AS DATE)

-- 널값시 처리

oracle : NVL(END_YN, 'N')

mssql : ISNULL(END_YN, 'N')

-- 사용된 바이트 수를 반환합니다

oracle : vsize(expression)

mssql : DATALENGTH ( expression )

-- 조건문

oracle : IF 조건1 THEN 처리1 ELSIF 조건2 THEN 처리2 ELSE 처리3 END IF;

mssql : IF 조건1 처리1 ELSE IF 조건2 처리2 ELSE 처리3

-- 변수에 값 할당시

oracle : param := 0;

mssql : SET @param = 0;

-- 문자열 자르기

oracle : substr('20200520', 1, 4) --- 2020

mssql : substring('20200520', 1, 4)

oracle : substr('20200520', 0, 4) --- 2020

mssql : substring('20200520', 1, 4) -- 변환 작업시 주의해서 1로 수정해야 함

-- 절삭하기

oracle : SELECT TRUNC(150.75, 1) FROM DUAL;

mssql : SELECT ROUND(150.75, 1, 1);

-- 나머지 구하기

oracle : SELECT MOD(12,5) FROM DUAL;

mssql : SELECT 12%5

-- 두 기간의 월 수 구하기

oracle : SELECT TRUNC(MONTHS_BETWEEN(TO_DATE('2020-06-05','RRRR-MM-DD'), TO_DATE('2020-05-01','RRRR-MM-DD'))) "month" FROM DUAL;

mssql : SELECT DATEDIFF(MONTH, CAST('2020-05-01' AS DATE), CAST('2020-06-05' AS DATE))

-- 마지막 일자 구하기

oracle : select TO_CHAR(LAST_DAY(sysdate), 'DD') from dual

mssql : select DAY(DATEADD(DAY,-1,DATEADD(MONTH,1,CAST(CONVERT(CHAR(6),GETDATE(),112)+'01' AS DATE))))

-- 올림

oracle : select ceil(1.1) from dual; -- 2

mssql : select ceiling(1,1) -- 2

-- ORACLE

SELECT LEVEL_CODE,

LAG(LEVEL_CODE) OVER (ORDER BY LEVEL_CODE) UPLEVEL,

LAG(GRADE_CODE) OVER (ORDER BY LEVEL_CODE) UPGRADE

FROM HR_CODE_LEVEL

-- MSSQL

SELECT A.LEVEL_CODE, B.LEVEL_CODE UPLEVEL, B.GRADE_CODE UPGRADE

FROM

(SELECT ROW_NUMBER() OVER(ORDER BY LEVEL_CODE) ROWID, LEVEL_CODE, LEVEL_NAME, GRADE_CODE FROM HR_CODE_LEVEL) A

LEFT OUTER JOIN

(SELECT ROW_NUMBER() OVER(ORDER BY LEVEL_CODE) ROWID, LEVEL_CODE, LEVEL_NAME, GRADE_CODE FROM HR_CODE_LEVEL) B

ON

A.ROWID = B.ROWID+1

 

[출처] blog.naver.com/dbbible/221969929542

mssql  줄바꿈 치환

 

 

 REPLACE(REPLACE(CONTENT, char(13) , '' ) ,  char(10), '' ) 

 

 

 

* 줄바꿈, 탭문자 제거 방법(text 타입도 포함)

 

 

- 변경 스트링 함수

replace([컬럼명], [변경할 문자], [변경될 문자])

 

- 엔터, 탭 문자 제거 함수 활용

Tab : char(9)

Line feed: char(10)

Carriage return: char(13)

 

 

>엔터 : replace(replace([컬럼명], char(13), ''), char(10), '')

>탭 : replace([컬럼명], char(9), '')

 

 

 텍스트 타입일 경우, [replace 함수의 인수 1에 대한 인수 데이터 형식 text이(가) 잘못되었습니다.] 에러를 확인할 수 있다.

 

=> replace(convert(varchar(max), [컬럼명]), [변경할 문자], [변경될 문자])

 

TEXT 타입 컬럼명 모두 치환

replace(replace(replace(convert(varchar(max),isnull([컬럼명], '-')), char(9), ' '),char(10), ' '), char(13), '') AS [컬럼명

출처: https://ngio.co.kr/3253

정렬되지 않은 컬럼데이터를 row_number로 다시 넣는 쿼리
해당 쿼리를 통해 PK값에 잡혀 있던 컬럼의 값을 다시 정렬해서 넣을 수 있을거 같음

  UPDATE A
  SET A.NUM = A.RowNum
   FROM ( 
SELECT NUM, ROW_NUMBER() OVER (ORDER BY 정렬기준의컬럼 ASC) AS RowNum 
FROM 테이블명  
WHERE  (1 = 1) AND ownerID IN ('62') : 원하는 조건넣는 부분

)
) AS A

로그인에서 오른쪽 마우스 선택하여 "새 로그인"을 선택한다.

새로운 로그인 계정을 추가한다. 일반 탭에서 로그인 아이디와 암호 그리고 사용할 기본 데이터베이스 설정을 해준다.


사용자 매핑 선택하면 위와 같은 화면이 나온다. 위와 같이 권한을 준다. 데이터베이스 역할 멤버 자격을 잘 못 선택할 경우 사용자 권한 설정을 하여도 모든 테이블이 보이게 된다. 기본 public으로만 셋팅하고 확인을 누른다.

로그인에 test 계정이 추가 되었고, TEST 데이터 베이스에 사용자에 test도 추가 되었다.

test 사용자에서 마우스 오른쪽을 클릭한 후 "속성"을 선택하면 위와 같은 화면이 나온다. 일반에서 설정할 필요 없고, 보안개체를 선택한 후 위에서 추가 버튼을 선택한다.


개체 추가 화면이 보이고, 특정 개체를 선택한다.


개체 유형을 선택한다.

권한을 줄 개체 유형을 선택한 후 확인 버튼을 누른다.

개체 유형 선택 후 선택할 개체 이름을 입력한 후 이름 확인을 누르면 필터가 되고, 찾아보기를 선택하면 개체 유형에 맞는 모든 정보가 보인다. table이란 이름을 입력하고 이름 확인을 선택한다.

권한을 줄 테이블을 체크한 후 확인을 준다. Table_1을 선택한 후 확인을 누른다.

위와 같이 추가 되고 확인을 누른다.

위 테이블에 SELECT 권한만 주고 확인을 누른다.

새로 생성한 계정으로 로그인 하면 추가된 테이블만 조회 가능하다.


특정 명이 들어있는 테이블, 뷰, 프로시저, 함수 등이 많은 경우 개체유형 체크가 번거롭기 때문에..


스크립트 선택하여 새쿼리 창 작업을 선택 하면 아래와 같이 구분이 생성된다.
use [TEST]
GO
GRANT SELECT ON [dbo].[TestTable] TO [test]
GO
위 구문을 복사하고,

SELECT 'GRANT SELECT ON [dbo].[' + name + '] TO [test]'
FROM sysobjects
WHERE name like '%table%'


위와 같이 셀렉트를 날리면 table이 포함된 테이블, 뷰, 프로시저, 함수이 위 구문으로 생성되고 그 문을 복사하여 일괄 명령을 날리면 손쉽게 명이 같은 개체에 권한을 부여할 수 있다.


출처 : http://yhn321.tistory.com/121




 - MSSQL 날짜 변환표 (기준날짜를 대상으로 CONVERT 실행하여 날짜 형변환)
 
번호 쿼리  결과 코드
 0  CONVERT(VARCHAR, GETDATE(), 0)  01 02 2000 1:14PM  MM DD YYYY H:MM
 1  CONVERT(VARCHAR, GETDATE(), 1)  01/02/2000  MM/DD/YYYY
 2  CONVERT(VARCHAR, GETDATE(), 2)  00.01.02  YY.MM.DD
 3  CONVERT(VARCHAR, GETDATE(), 3)  02/01/00  DD/MM/YY
 4  CONVERT(VARCHAR, GETDATE(), 4)  02.01.00  DD.MM.YY
 5  CONVERT(VARCHAR, GETDATE(), 5)  02-01-00  DD-MM-YY
 6  CONVERT(VARCHAR, GETDATE(), 6)  02 01 00  DD MM YY
 7  CONVERT(VARCHAR, GETDATE(), 7)  01 02, 00  MM DD, YY
 8  CONVERT(VARCHAR, GETDATE(), 8)  13:14:15  HH:MM:SS
 9  CONVERT(VARCHAR, GETDATE(), 9)  01 02 2000 1:14:15.678PM  NN DD YYYY H:MM:SS.MS
 10  CONVERT(VARCHAR, GETDATE(), 10)  01-02-00  MM-DD-YY
 11  CONVERT(VARCHAR, GETDATE(), 11)  02/01/00  DD/MM/YY
 12  CONVERT(VARCHAR, GETDATE(), 12)  000102  YYMMDD
 13  CONVERT(VARCHAR, GETDATE(), 13)  02 01 2000 13:14:15.678  DD MM YYYY HH:MM:SS.MS
 14  CONVERT(VARCHAR, GETDATE(), 14)  13:14:15.678  HH:MM:SS.MS
 20  CONVERT(VARCHAR, GETDATE(), 20)  2000-01-02 13:14:15  YYYY-MM-DD HH:MM:SS
 21  CONVERT(VARCHAR, GETDATE(), 21)  2000-01-02 13:14:15.678  YYYY-MM-DD HH:MM:SS.MS
 22  CONVERT(VARCHAR, GETDATE(), 22)  01/02/00 1:14:15 PM  MM/DD/YY H:M:S
 23  CONVERT(VARCHAR, GETDATE(), 23)  2000-01-02  YYYY-MM-DD
 24  CONVERT(VARCHAR, GETDATE(), 24)  13:14:15  HH:MM:SS
 25  CONVERT(VARCHAR, GETDATE(), 25)  2000-01-02 13:14:15.678  YYYY-MM-DD HH:MM:SS.MS
 100  CONVERT(VARCHAR, GETDATE(), 100)  01 02 2000 1:02PM  MM DD YYYY H:MM
 101  CONVERT(VARCHAR, GETDATE(), 101)  01/02/2000  MM/DD/YYYY
 102  CONVERT(VARCHAR, GETDATE(), 102)  2000.01.02  YYYY.MM.DD
 103  CONVERT(VARCHAR, GETDATE(), 103)  02/01/2000  DD/MM/YYYY
 104  CONVERT(VARCHAR, GETDATE(), 104)  02/01/2000  DD/MM/YYYY
 105  CONVERT(VARCHAR, GETDATE(), 105)  02-01-2000  DD-MM-YYYY
 106  CONVERT(VARCHAR, GETDATE(), 106)  02 01 2000  DD MM YYYY
 107  CONVERT(VARCHAR, GETDATE(), 107)  01 02, 2000  MM DD, YYYY
 108  CONVERT(VARCHAR, GETDATE(), 108)  13:14:15  HH:MM:SS
 109  CONVERT(VARCHAR, GETDATE(), 109)  01 02 2000 1:14:15.678PM  MM DD YYYY H:MM:DD.MS
 110  CONVERT(VARCHAR, GETDATE(), 110)  01-02-2000  MM-DD-YYYY
 111  CONVERT(VARCHAR, GETDATE(), 111)  2000/01/02  YYYY/MM/DD
 112  CONVERT(VARCHAR, GETDATE(), 112)  20000102  YYYYMMDD
 113  CONVERT(VARCHAR, GETDATE(), 113)  02 01 2000 13:14:15.678  DD MM YYYY HH:MM:DD.MS
 114  CONVERT(VARCHAR, GETDATE(), 114)  13:14:15:678  HH:MM:DD:MS
 120  CONVERT(VARCHAR, GETDATE(), 120)  2000-01-02 13:14:15  YYYY-MM-DD HH:MM:SS
 121  CONVERT(VARCHAR, GETDATE(), 121)  2000-01-02 13:14:15.678  YYYY-MM-DD HH:MM:SS.MS
 126  CONVERT(VARCHAR, GETDATE(), 126)  2000-01-02T13:14:15.678  YYYY-MM-DDT HH:MM:SS.MS
 127  CONVERT(VARCHAR, GETDATE(), 127)  2000-01-02T13:14:15.678  YYYY-MM-DDT HH:MM:SS.MS
 131  CONVERT(VARCHAR, GETDATE(), 131)  1/06/1421 1:13:14:678PM  




년 월 일 각각 표기 하기

SELECT DATEPART(yy, getdate()); SELECT DATEPART(mm, getdate()); SELECT DATEPART(dd, getdate());


● DATEADD - 날짜 계산

MS-SQL에서 DATEADD() 함수를 사용하여 날짜를 계산(덧셈, 뺄셈)할 수 있습니다.

DATEADD 사용 구문

DATEADD (DATEPART , NUMBER , DATE )

DATEADD 사용 예시

SELECT DATEADD(YY, -1, GETDATE()) AS '1년전' SELECT DATEADD(YY, 1, GETDATE()) AS '1년후' SELECT DATEADD(MM, -1, GETDATE()) AS '1개월전' SELECT DATEADD(MM, 1, GETDATE()) AS '1개월후' SELECT DATEADD(DAY, -10 , GETDATE()) AS '10일전' SELECT DATEADD(DAY, 10 , GETDATE()) AS '10일후'

실행 결과

2019-09-29 23:21:09.833 2021-09-29 23:21:09.833 2020-08-29 23:21:09.833 2020-10-29 23:21:09.833 2020-09-19 23:21:09.833 2020-10-09 23:21:09.833


SELECT * FROM (
SELECT (CASE WHEN MAIN.COLUMN_ID = 1 THEN MAIN.TABLE_COMMENTS ELSE '' END)  table_kor_name
     , (CASE WHEN MAIN.COLUMN_ID = 1 THEN MAIN.TABLE_NAME ELSE '' END ) table_eng_name
     , MAIN.COLUMN_ID column_id
     , MAIN.COLUMN_NAME column_name
     , MAIN.COLUMN_COMMENTS column_comments
     , (CASE WHEN MAIN.DATA_TYPE = 'VARCHAR2' THEN 'VARCHAR' ELSE MAIN.DATA_TYPE END ) AS data_type
     , (CASE MAIN.DATA_TYPE WHEN 'NUMBER' THEN ''
                            WHEN 'DATE'   THEN '' ELSE TO_CHAR(MAIN.DATA_LENGTH) END) data_type_length
     , (CASE NVL(MAIN.NULL_FLAG, 'N') WHEN 'N' THEN 'N' ELSE '' END) null_flag
     , (SELECT CONST.CONSTRAINT_NAME FROM USER_CONSTRAINTS CONST, USER_CONS_COLUMNS COLS, USER_CONS_COLUMNS R_COLS
         WHERE CONST.CONSTRAINT_NAME   = COLS.CONSTRAINT_NAME
           AND CONST.CONSTRAINT_TYPE = 'P'
           AND CONST.R_CONSTRAINT_NAME = R_COLS.CONSTRAINT_NAME(+)
           AND CONST.TABLE_NAME  = MAIN.TABLE_NAME
           AND COLS.COLUMN_NAME = MAIN.COLUMN_NAME) AS PK
      , ( SELECT DISTINCT CONST.CONSTRAINT_NAME||' ['||COLS.COLUMN_NAME||'('||CONST.R_CONSTRAINT_NAME||')]'
              FROM USER_CONSTRAINTS CONST
                 , USER_CONS_COLUMNS COLS
                 , USER_CONS_COLUMNS R_COLS
             WHERE CONST.CONSTRAINT_NAME = COLS.CONSTRAINT_NAME
               AND CONST.CONSTRAINT_TYPE = 'R'
               AND CONST.R_CONSTRAINT_NAME = R_COLS.CONSTRAINT_NAME(+)
               AND CONST.TABLE_NAME  = MAIN.TABLE_NAME
               AND COLS.COLUMN_NAME = MAIN.COLUMN_NAME
              -- AND rownum < 2
          ) AS FK
--     , (CASE SUB.CONSTRAINT_TYPE WHEN 'P' THEN 'PK' WHEN 'R' THEN 'FK ('||SUB.R_CONST_NAME||')' END) key_flag
  FROM (SELECT T_COMT.COMMENTS AS table_comments
             , T_COLS.TABLE_NAME AS table_name
             , C_COMT.COMMENTS AS column_comments
             , T_COLS.COLUMN_NAME AS column_name
             , (CASE T_COLS.NULLABLE WHEN 'Y' THEN 'Y' END) AS null_flag
             , T_COLS.DATA_TYPE AS data_type
             , T_COLS.DATA_LENGTH AS data_length
             , T_COLS.COLUMN_ID AS column_id
             , T_COLS.DATA_PRECISION AS data_precision
             , T_COLS.DATA_SCALE AS data_scale
          FROM USER_TAB_COLUMNS T_COLS
             , USER_TAB_COMMENTS T_COMT
             , USER_COL_COMMENTS C_COMT
         WHERE T_COLS.TABLE_NAME  = T_COMT.TABLE_NAME
           AND T_COLS.TABLE_NAME  = C_COMT.TABLE_NAME
           AND T_COLS.COLUMN_NAME = C_COMT.COLUMN_NAME
           AND T_COMT.TABLE_TYPE  = 'TABLE' ) MAIN
 WHERE MAIN.TABLE_NAME  = UPPER('테이블명')  /*특정 테이블 조회일 경우 사용.*/
)
 ORDER BY table_eng_name, PK, FK, COLUMN_ID 
;


-- 인덱스 조회
SELECT c.index_name
     , c.column_name
     , c.column_position
     , i.uniqueness 
  FROM user_indexes i
     , user_ind_columns c 
 WHERE c.index_name = i.index_name 
   AND c.table_name = '테이블명'; 


-- Foreing Key가 여러개 일 경우 조회
select distinct *
  from (
 SELECT CONST.CONSTRAINT_NAME, COLS.COLUMN_NAME, cols.position
  FROM USER_CONSTRAINTS CONST
     , USER_CONS_COLUMNS COLS
     , USER_CONS_COLUMNS R_COLS
 WHERE CONST.CONSTRAINT_NAME = COLS.CONSTRAINT_NAME
   AND CONST.CONSTRAINT_TYPE = 'R'
   AND CONST.R_CONSTRAINT_NAME = R_COLS.CONSTRAINT_NAME(+)
   AND CONST.TABLE_NAME  = '테이블명'
               --AND COLS.COLUMN_NAME = MAIN.COLUMN_NAME
 order by const.constraint_name, cols.position
 )
  order by constraint_name, position
   
MSSQL 에서 sp_help "테이블명" 으로 하면 테이블의 정보를 확인할 수 있으나
컬럼의 Comment까지 같이 확인은 안된다.
아래는 테이블의 컬럼Comment를 확인할 수 있는 쿼리이다.
 
SELECT A.TABLE_NAME, 
		C.VALUE AS TABLE_COMMENT,
		A.COLUMN_NAME, A.DATA_TYPE, 
		ISNULL(CAST(A.CHARACTER_MAXIMUM_LENGTH AS VARCHAR),  
				CAST(A.NUMERIC_PRECISION AS VARCHAR) + ',' +
				CAST(A.NUMERIC_SCALE AS VARCHAR)) AS COLUMN_LENGTH,
		A.COLUMN_DEFAULT, A.IS_NULLABLE,
		B.VALUE AS COLUM_COMMENT
FROM INFORMATION_SCHEMA.COLUMNS A LEFT OUTER JOIN
	SYS.EXTENDED_PROPERTIES B
	ON B.major_id = object_id(A.TABLE_NAME) 
	AND A.ORDINAL_POSITION = B.minor_id
	LEFT OUTER JOIN
		(SELECT object_id(objname) AS TABLE_ID,
					VALUE
		FROM ::FN_LISTEXTENDEDPROPERTY
			(NULL, 'User','dbo','table',
				NULL, NULL, NULL)
			) C
	ON object_id(A.TABLE_NAME) = C.TABLE_ID
WHERE A.TABLE_NAME = '테이블명'
ORDER BY A.TABLE_NAME, A.ORDINAL_POSITION 
 

SELECT A.COLUMN_ID,
       A.COLUMN_NAME,
       A.DATA_TYPE,
       CASE WHEN A.DATA_TYPE = 'NUMBER' THEN A.DATA_PRECISION ||','|| A.DATA_SCALE
            WHEN A.DATA_TYPE = 'DATE' THEN '7'
            ELSE TO_CHAR(DATA_LENGTH)
       END DATA_SIZE,
       B.COMMENTS COMMENTS,
       DECODE(D.CONSTRAINT_TYPE, 'P', 'PK') AS KEY_FIELD
FROM ALL_TAB_COLUMNS A INNER JOIN ALL_COL_COMMENTS B
                       ON  A.TABLE_NAME = B.TABLE_NAME
                       AND A.OWNER = B.OWNER
                       AND A.COLUMN_NAME= B.COLUMN_NAME
                     LEFT OUTER JOIN ALL_CONS_COLUMNS C
                       ON A.TABLE_NAME = C.TABLE_NAME
                       AND A.OWNER = C.OWNER
                       AND A.COLUMN_NAME = C.COLUMN_NAME
                       AND C.POSITION IS NOT NULL
                     LEFT OUTER JOIN ALL_CONSTRAINTS D
                       ON  C.TABLE_NAME = D.TABLE_NAME
                       AND C.OWNER = D.OWNER
                       AND C.CONSTRAINT_NAME  = D.CONSTRAINT_NAME
                       AND D.CONSTRAINT_TYPE = 'P'
WHERE A.TABLE_NAME = '테이블명'
ORDER BY A.COLUMN_ID

출처 : http://blog.naver.com/PostView.nhn?blogId=2zerox&logNo=90150539116
[출처] MSSQL 테이블 정보 쿼리(Comment 포함)|작성자 수정이아빠



 SELECT sc.name +'.'+ ta.name TableName
,SUM(pa.rows) RowCnt
FROM sys.tables ta
INNER JOIN sys.partitions pa
ON pa.OBJECT_ID = ta.OBJECT_ID
INNER JOIN sys.schemas sc
ON ta.schema_id = sc.schema_id
WHERE ta.is_ms_shipped = 0 AND pa.index_id IN (1,0)
GROUP BY sc.name,ta.name
ORDER BY SUM(pa.rows) DESC


mssql 테이블 목록과 각 테이블의 데이터수 쿼리

추가)
1. 테이블 목록 가져오기
 select distinct table_name from information_schema.columns
SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE 1=1
--AND TABLE_TYPE ='VIEW'
AND TABLE_TYPE ='BASE TABLE'
--AND TABLE_NAME NOT LIKE '%TEST%'
AND TABLE_SCHEMA = 'dbo'
ORDER BY TABLE_NAME 
2. 프로시져 목록 가져오기
 select distinct specific_name from INFORMATION_SCHEMA.PARAMETERS

출처:http://blog.sqlauthority.com/2010/09/08/sql-server-find-row-count-in-table-find-largest-table-in-database-part-2/


MSSQL 주석달기


1. 주석추가 (add)

--테이블

EXEC   sp_addextendedproperty 'MS_Description', '테이블설명', 'user', dbo, 'table',테이블명

--컬럼들

EXEC   sp_addextendedproperty 'MS_Description', '컬럼설명', 'user', dbo, 'table', 테이블명, 'column', 컬럼명


 2. 주석수정 (update)

--테이블

EXEC   sp_updateextendedproperty 'MS_Description', '테이블설명', 'user', dbo, 'table',테이블명

--컬럼들

EXEC   sp_updateextendedproperty 'MS_Description', '컬럼설명', 'user', dbo, 'table', 테이블명, 'column', 컬럼명



 ORACLE 주석달기

--테이블에 주석달기

COMMENT ON TABLE 테이블명 IS '주석'

--컬럼에 주석달기

COMMENT ON COLUMN 테이블명.컬럼명 IS '주석'

주석삭제

COMMENT ON COLUMN 테이블명.컬럼명 IS ''


/////////////디코드 수정/////////////////

DECODE(Sport,'Cricket','England','Hockey','India','Base Ball','America') AS 'Originating Country'



CASE Sport
    WHEN 'Cricket' THEN 'England' 
    WHEN 'Hockey' THEN 'India' 
    WHEN 'Base Ball' THEN 'America' 
    ELSE NULL 
END AS 'Originating Country'


///////////////////////////////////////


/////////////TO_CHAR 수정//////////////

TO_CHAR(SYSDATE, 'YYYY-MM-DD')
> CONVERT(VARCHAR(10), GETDATE(), 120)

TO_CHAR(SYSDATE, 'YYYYMMDD')
> CONVERT(VARCHAR, GETDATE(), 112)

TO_CHAR(CON_STRDATE,'YYYY')
>CONVERT(VARCHAR(4),GETDATE(),112)

TO_CHAR(CON_STRDATE,'MM')
>CONVERT(VARCHAR(2),GETDATE(),1)

TO_CHAR(CON_STRDATE,'DD')
>CONVERT(VARCHAR(2),GETDATE(),5)

TO_CHAR(CON_STRDATE,'D')
>DATEPART(W, GETDATE())


/** SYSDATE -> GETDATE()

///////////////////////////////////////



///////////TO_DATE 수정///////////////

TO_DATE('2008-01-01','YYYY-MM-DD')

CONVERT(DATETIME,'2008-01-01')




TO_DATE('20080101','YYYYMMDD')

CONVERT(DATETIME,'20080101')

//////////////////////////////////////



/////////////////날짜 - 날짜/////////////

TO_DATE('20081210','YYYYMMDD') - TO_DATE('20081110','YYYYMMDD')


DATEDIFF(DD,CONVERT(DATETIME,'20081110'),CONVERT(DATETIME,'20081210'))

/////////////////////////////////////////




//////////////// 999,999,999 포멧지정///////////////
TO_CHAR(999999999,'fm999,999,999')

REPLACE(CONVERT(VARCHAR,CONVERT(MONEY,999999999),1),'.00','')

///////////////////////////////////////////////////


///////////////////// ROWNUM ///////////////////////////////

ROWNUM

ROW_NUMBER() OVER(ORDER BY '정렬기준 컬럼')

///////////////////////////////////////////////////////////



/////////////////// || 를 + 로 변경할것//////////////////


////////////////// NVL -> ISNULL ////////////////////////


////////////////// LENGTH -> LEN ////////////////////////

////////////////// SUBSTR -> SUBSTRING ////////////////////////

//////////////// INSERT안에 서브쿼리가 들어가있는 경우//////////////
INSERT INTO TEST(COUNT) VALUES(SELECT COUNT(*) FROM TEST)
-> 
DECLARE @COUNT INT;
SELECT @COUNT = COUNT(*) FROM TEST
INSERT INTO TEST(COUNT) VALUES(@COUNT)


/////////////// LPAD(RPAD) 처리 ///////////////////////////////
SELECT LPAD('31',5,'0')
-> REPLICATE('0',5 - LEN('31')) + '31'


////////////////////// CONNECT BY ////////////////////////////
WITH 사용하여 마소를 욕하며 변환

///////////////////// (+)를 이용한 JOIN /////////////////////////
무조건 표준 JOIN문을 이용해 변환 =* 사용시 호환성문제와 조인된 테이블을 참조할 수 없음



UPDATE /*+ BYPASS_UJVC */

(SELECT TARGET_PATH ORG,  '/sb/'||TARGET_PATH UPD FROM WCM_FOLDER_MAP WHERE SERVER_ID = 1) A

SET A.ORG = A.UPD




update 의 서브쿼리로 자신이 필요로 하는  기존컬럼과 변경하는 컬럼들을 select해놓고 as 를 주어

 값을 뷰들로 매칭시켜서 대입한다.



오라클 힌트//

- 오라클 tns설정하는 방법

오라클이 있는 폴더를 연다.

/ORACLE/product/9.2.0/network/admin/tnsnames.ora 
연결하고자 하는 오라클 host를 다음과 같이 입력한다.

 

DBTEST =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST =xxx.xxx.xxx.xxx)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = dbtest)
    )
  )

 

2대의 오라클 서버로 failover기능 부여하여 설정 시
  
TESTDB =
  (DESCRIPTION =
        (LOAD_BALANCE=OFF)
        (FAILOVER=ON)
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xx1)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xx2)(PORT = 1521))
    )
 (CONNECT_DATA =
                 (SERVER = DEDICATED)
                 (SERVICE_NAME =testdb)
                 (failover_mode=(type=none)(method=basic))
          )
)

 

- 유저에 대한 테이블 스페이스 변경

alter user user명 default tablespace TBS명;


- 유저 생성과 함께 테이블 스페이스 지정

create user user명

identified by 패스워드
default tablespace TBS명;







요즘 툴들이 좋아서 클릭만으로도 할 수 있지만 기본을 잊지 않기 위해서 ~~~


컬럼명 변경

ALTER TABLE board RENAME COLUMN name TO boardName;

컬럼 타입수정
ALTER TABLE board MODIFY ( boardName varchar2(100) [NULL]|[NOT NULL] );

컬럼 삭제
ALTER TABLE board DROP COLUMN boardName;

컬럼 추가
ALTER TABLE board ADD ( address varchar2(100) default '' );

컬럼의 제약조건 삭제
ALTER TABLE userTable DROP PRIMARY KEY:
ALTER TABLE userTable DROP CONSTRAINT userTb_fk_userid;

외래키 추가
ALTER TABLE [테이블이름] ADD CONSTRAINT [외래키이름] FOREIGN  KEY ([필드이름]) REFERENCES [참조테이블이름](참조필드이름);


ALTER TABLE userTable ADD CONSTRAINT [userid_fk] FOREIGN KEY (userid) REFERENCES org_user_tb(userid)

 

 

※board 는 테이블명 입니다.



오라클용 쿼리에  ROWNUM 를 MYSQL용으로 변환시에 아래 처럼 간단하게 적용하면 된다.

Oracle용 쿼리::::

SELECT A.* FROM ( 
  SELECT ROWNUM NUM,  *
     FROM WCM_CONTENT_SET cs 
  )A WHERE NUM >= ? AND NUM <= ?

 

MYSQL용 쿼리::::

SELECT A.* FROM ( 
  SELECT (@ROWNUM := @ROWNUM + 1) AS NUM, *
   FROM WCM_CONTENT_SET cs, 
(SELECT @ROWNUM := 0) rr 
  
)A WHERE NUM >= ? AND NUM <= ?

+ Recent posts