본문 바로가기

Database/MSSQL

Way to access the next row value 특정 record에 연속된 (다음 id, 하지만 연속적이지는 않을 수 있는) record를 가져오는 방법입니다. 이를 구현하기 위해서 CTE(Common table expression)을 이용하였습니다. ROW_NUMBER()를 이용하여 연속된 번호를 부여한 뒤에 Join하는 형태의 전략으로 접근하였습니다. WITH CTE AS ( SELECT ROW_NUMBER() OVER (ORDER BY id DESC) AS RowNo , * FROM Log WITH (NOLOCK) WHERE dailyID = 191 AND type = 1 ) SELECT CUR.id , CUR.dailyID , CUR.type , '|' AS'|' , NXT.id , NXT.dailyID , NXT.type FROM CTE AS.. 더보기
Insert or update at once 고전적인 방식은 IF EXIST THEN ~ ELSE ~ END 의 구문을 이용하여 분기 처리하는 방법이 있습니다.조금 진보한 방식으로 MERGE INTO를 사용하는 방법이 있을 수 있습니다. (MSSQL 2008~)이는 Oracle등의 DBMS에서도 지원하는 것으로 알고 있습니다.조건절에 작성한 부분은 실제 Insert/Update에서 생략이 되므로 타이핑할 양도 줄어드는 효과가 있습니다. MERGE INTO [T_N_USER_MOVIE_FAVORITES] -- 대상 table USING(SELECT '0' AS CNT) AS DUAL -- 관용 ON (UserIdx = $useridx$ -- 조건절 AND MovieIdx = $movieidx$) WHEN MATCHED THEN -- 일치하는 reco.. 더보기
How to Determine Whether Two Date Ranges Overlap 간단하지만 많이 필요로 하는 두 데이터 기간의 overlap 판정을 위한 로직을 소개하려고 합니다.다음의 두 기간이 있고, 겹치는 날짜가 있는 지를 판정해야합니다. 기간1: 시작일1 ~ 종료일1 (예: 2016-06-17~2016-06-24)기간2: 시작일2 ~ 종료일2 (예: 2016-06-20~2016-06-30)위의 두 기간은 일부 겹치는 구간이 있습니다. 필요한 결과값은 두 기간이 겹침 여부 (bool)이므로 다음의 로직을 적용하여 복잡한 조건 없이 결과만 판단할 수 있습니다.Reference를 보시면 해당 조건의 proof가 있으므로 참조하세요.(시작일1 = 시작일2) 특별한 내장함수 등의 활용이 없으므로, 대부분의 RDB에서 동일하게 활용할 수 있습니다. Referencehttp://stack.. 더보기
transaction log for database is full LDF파일의 크기 제한이 걸리거나, 혹은 물리적인 Disk가 full되는 경우 등으로 'Transaction log for database is full' 이라는 Exception이 발생하는 경우가 발생합니다. 개발과정에서 Stress test를 하다가 이러한 과정이 발생했을 때, 간단하게 해결할 수 있는 방법을 정리합니다. 당연, 운용계라면 적절한 Backup 절차에 준하여 대응이 되어야 할 것이며, 아래는 개발과정에 발생하는 이슈를 간단하게 대응하는 방법으로 접근합니다. USE {DBName}; GO -- Truncate the log by changing the database recovery model to SIMPLE. ALTER DATABASE {DBName} SET RECOVERY SIMPL.. 더보기
a connection was successfully established with the server, but then an error occurred during the pre-login handshake MSSQL 접속 후 다음의 에러가 발생하는 경우가 있습니다. 검색해서 보니 대부분은 껏다가 켜라고 하네요. :)저는 다음의 command를 실행하는 것을 시도하는 게 가장 매력적일 것 같습니다.감사합니다. 문제의 원인No configuration for remote connection to SQL serverProtocol issue 해결책command 창에서 다음의 명령을 수행: Netsh winsock resetOr 컴퓨터 재시작 Referenceshttps://msdn.microsoft.com/en-us/library/aa952081.aspxhttps://msdn.microsoft.com/ko-kr/library/aa952081.aspx> BizTalk Server 데이터베이스가 포함된 원격 SQL.. 더보기
Unique index setting #2 (with Criteria) Unique Index 는 중복값의 입력을 방지하는 경우 매우 유용하게 사용할 수 있습니다. 다만, 단일 값이라는 판단은 '조건'을 가지고 판단해야 하는 경우가 있습니다. 예를 들면 특정 상태의 값은 중복이 될 수 없다던지... NULL 값은 중복을 허용한다던지. 이를 위해서 WHERE 절을 사용할 수 있습니다. 예제는 다음과 같습니다. CREATE UNIQUE NONCLUSTERED INDEX [uq_user_email] ON [dbo].[TB_User] ( [Email] ASC ) WHERE [Email] IS NOT NULL WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, D.. 더보기
CTE 무한루프 이전에 유용하게 사용했던 CTE SQL에서 간혹 오류가 나는 경우가 발생했습니다.'문의 완료되기 전에 최대 재귀 횟수(?)가 초과되었습니다.' 이는 서버에서 CTE로 인한 무한루프를 방지하기 위한 장치의 제한이 걸렸기 때문일 가능성이 있습니다.기본적으로 최대 100회의 재귀 CTE가 허용되며, 이는 0~32,767의 범위를 가질 수 있습니다.질의의 마지막에 다음 구문을 추가하는 것으로 재귀 회수를 제어할 수 있습니다. SQL OPTION (MAXRECURSION 100) Referenceshttps://technet.microsoft.com/ko-kr/library/ms175972(v=sql.105).aspxhttps://technet.microsoft.com/ko-kr/library/ms181714(v.. 더보기
CTE 일반적으로 Group은 재귀적으로 참조하는 형태입니다.(Group.ParentGroupId = Group.Id 형태) 이에 데이터 조회시 반복처리를 해야 하는 형태가 발생함으로 이를 쉽게 처리할 수 있는 방법은 없을까요?해답은 MSSQL 2005 이후 버전에서 지원하는 CTE(Common Table Expression) 입니다. Anchor set을 설정하고, 이를 재귀적으로 순환하며 참조하게 하는 SQL를 작성할 수 있습니다. Example WITH DirectReports(ManagerID, EmployeeID, Title, EmployeeLevel) AS ( -- Anchor SELECT ManagerID, EmployeeID, Title, 0 AS EmployeeLevel FROM dbo.MyEm.. 더보기
Encrypt specific Table.column 주민등록번호의 저장을 지양하고 있고, 저장을 하더라도 암호화 하도록 권고하고 있습니다. 그럼에도 불구하고 legacy system에서 주민등록번호가 반드시 필요한 경우가 있기 때문에... 주민등록번호를 저장해야 하는 경우가 많습니다... (어쩌라고...) 그 외에도 민감한 정보를 감추기 위해서 Db에 값을 저장할 때, 암호화 하여 저장해야 할 필요가 있습니다. Db자체적으로 암호화를 하거나, Code에서 할 수 있는데, Db에서 처리함으로써 취할 수 있는 장점은 다음과 같습니다. 1. batch 처리 시에 business logic을 경유할 필요가 없음. (DB2DB 작업의 단순화) 2. 복수의 Application에서 암호/복호화 로직을 적용할 필요가 없음. 다만, ARIA, SEED 알고리즘의 적용은.. 더보기
TDE (Transparent Data Encryption) Database의 보안을 위한 첫 단계. TDE는 물리적인 미디어를 도난 당한 경우를 대비하기 위한 설정입니다. TDE는 그 말 그대로 투명한 암호화이므로, 설정 이후로는 특별한 작업을 할 필요가 없습니다.등록 및 조회 등을 위한 쿼리에 변경 사항이 없습니다. 즉, 개발자들은 신경쓰지 않고 개발할 수 있습니다. :) 적용방법 1. Master key 생성 // @master DB 2. Certificate 생성 // using master key 3. Database encryption key 생성 4. Turn on TDE Db의 properties > Options > State > Encryption Enabled: True SQL 괄호로 묶은 부분을 치환하여 실행하면 됩니다. USE master .. 더보기