반응형


(1) 데이터베이스 복구 모델
  - 데이터베이스 속성 창의 옵션 페이지에서 확인 및 변경 가능

  1. 전체복구모델 : 문제가 발생한 시점까지 복구 가능

  2. 단순모델: 최근 백업받은 데이터까지만 복구 가능

  3. 대량로그복구모델

(2) 데이터베이스 백업 종류

  1. 전체 백업 : 차등 및 로그 백업을 하기전에 전체 백업이 선행 되야 함.

        BACKUP DATABASE 데이터베이스이름 TO [disk = "백업할 파일명" 또는 장치명]

  2. 차등 백업: 마지막 전체 백업 후 변경된 모든 데이터 백업

        BACKUP DATABASE 데이터베이스이름 TO [disk = "백업할 파일명" 또는 장치명] WITH DIFFERENTIAL

  3. 트랜잭션 로그 백업 : 로그 파일(ldf)에 대한 백업. 마지막 로그 백업을 받은 이후(또는 최초의 전체 백업 이후)의 
      변경된 내용만 백업 됨. 로그 백업이 이루어지고 나면 로그 파일은 비워 짐. 만약 로그를 강제로 비우려면
      데이터베이스 복구 모델을 '단순'으로 변경한 후, 다시 원래 모델인 '전체' 또는 '대량로그'로 돌린다.

        BACKUP LOG 데이터베이스이름 TO [disk = "백업할 파일명" 또는 장치명]

  4. 비상 로그 백업 : 데이터베이스 장애등 이상 발생시에 로그 백업. 비상 로그 백업을 받으면 해당 데이터베이스의
      상태는 '복원 중'으로 바뀜.

        BACKUP LOG 데이터베이스이름 TO [disk = "백업할 파일명" 또는 장치명] WITH NO TRUNCATE

 

반응형
반응형

조직구조나 BOM 과 같이 계층구조로 된 데이터에 대하여 쉽게 쿼리를 구현할 수 있도록 해주는 것이 CTE,
그중에서도 재귀적 CTE 이다.


create table test1

(mycode varchar(10), uppercode varchar(10))

insert into test1

(mycode, uppercode)

select 1, 2

union all

select 2, 3

union all

select 3, 4

union all

select 4, null

insert into test1

(mycode, uppercode)

select 10, 20

union all

select 20, 30

union all

select 30, 4

insert into test1

(mycode, uppercode)

select 5, 2

go

with cteTest(uppercode, mycode, levelno, groupcode)

as

(

       select uppercode, mycode, 0, mycode from test1 where uppercode = 4

       union all

       select a.uppercode, a.mycode, b.levelno+1, b.groupcode  from test1 a join cteTest b on a.uppercode = b.mycode

)

select * from cteTest

order by groupcode, levelno

go



with cteTest(uppercode, mycode, levelno, groupcode)

as

(

       select uppercode, mycode, 0, mycode from test1 where uppercode = 4

       union all

       select a.uppercode, a.mycode, b.levelno+1, b.groupcode  from test1 a join cteTest b on a.uppercode = b.mycode

)

select

       a.groupcode as rootcode,

       a.mycode as leafcode

from cteTest a

where

       a.levelno = (select MAX(levelno) from cteTest b

                                 where a.groupcode = b.groupcode)




마지막 쿼리는 계층구조의 최하위 레벨과 최상위코드(상위코드가 NULL) + 1인 레벨을 연결한 예이다.
(조직구조의 최하위 조직이 속한 최상위 조직을 알고자 하는 경우)

반응형
반응형

SQL서버 에서 제공되는 ROLLUP을 사용하면 그룹간의 소계 및 전체 합계를 쉽게 구할 수 있다.

create table test1
(id int,
 dept_code int,
 qty int)

insert into test1
 (id, dept_code, qty)
 select 4, 200, 1450
 union all
 select 6, 300, 1230
 union all
 select 3, 100, 3000
 union all
 select 1, 100, 1000
 union all
 select 5, 200, 2540
 union all
 select 2, 100, 2000
select
    case when dept_code is null and id is null then '합계'
         when id is null then '소계'
         else CAST(id as varchar(10)) 
    end as id,
    dept_code, SUM(qty) as qty
from 
    test1
group by 
  rollup (dept_code, id)


ROLLUP을 사용하지 않고 기존 ANSI Query를 사용하면 다음과 같이 할 수 있다.

select
       case b.gb when 1 then CAST(a.id as varchar(10))
                 when 2 then '소계'
                 when 3 then '합계'
       end as id,
       case when b.gb in (1,2) then a.dept_code end as dept_code,
       SUM(qty) as qty
from  
       test1 a
join
       (select 1 as gb union all select 2 union all select 3) b on 1=1
group by
       b.gb,
       case b.gb when 1 then CAST(a.id as varchar(10))
                 when 2 then '소계'
                 when 3 then '합계'
       end,
       case when b.gb in (1,2) then a.dept_code end
order by
       case when case when b.gb in (1,2) then a.dept_code end is null then 999
            else case when b.gb in (1,2) then a.dept_code end end, gb


결과는 동일하다.

반응형
반응형

SQL서버에서 Oracle을 연결된 서버로 구성한 후 OpenQuery로 조회를 하면

메시지 9803, 수준 16, 상태 1, 줄 1
"numeric" 유형에 대한 데이터가 잘못되었습니다.


라는 오류가 발생 할 때가 있다.

원인은 Oracle 테이블에서 Type이 int 나 decimal인 컬럼을 사용하게 되면 발생 한다.

연결된 서버 구성시 공급자를 'Oracle Providier for OLE DB'로 지정 했을 때 이런 현상이 있다.

(공급자를 Microsoft OLE DB Provider for Oracle로 했을 때는 어떤 지는 모르겠다.

참고로 연결된 서버로 Oracle 을 추가한 후 공급자 속성에서 반드시 Inprocess허용을 해줘야 된다.)


오류를 해결 하기 위해서는 두가지 정도의 방법이 있는 것 같다.

첫번째는 OpenQuery 파라미터로 넘기는 쿼리에서 int 나 decimal 타입의 컬럼은 모두 to_number() 또는 to_char()로 형변환을

해서 SELECT를 하는 방법이고, 두번째는 컬럼 타입을 NUMBER 또는 FLOAT 로 변경 하는 방법이다.

단 첫번째 방법을 사용하면 SELECT 인 경우에는 문제가 없으나 해당 컬럼에 대하여 INSERT, UPDATE 할때

오류가 발생 한다.


연결된 서버 "hr"의 OLE DB 공급자 "OraOLEDB.Oracle"이(가) 메시지 "ROW-00008: Cannot update data in a read-only column"을(를) 반환했습니다.
메시지 7343, 수준 16, 상태 4, 줄 1
연결된 서버 "hr"의 OLE DB 공급자 "OraOLEDB.Oracle"이(가) 테이블 "[OraOLEDB.Oracle]"을(를) UPDATE할 수 없습니다.
반응형

+ Recent posts