MS-SQL Server

[펌]Database Snapshot의 데이터 변경이 가능할까요?

임현수 2011. 11. 3. 23:20
정답은 당연히 "Database Snapshot의 데이터 변경은 당연히 불가능하다" 입니다. 
하지만 특정 경우에 대해서는 데이터 변경이 가능하여 이 부분에 대해서 소개드립니다.

길게 이야기할 필요 없이 바로 테스트를 진행해보도록 하겠습니다. 

1. 테스트 환경 셋팅

--@@ Orig 데이터베이스 생성

IF DB_ID('Orig') IS NOT NULL

        DROP DATABASE [Orig]

GO

 

CREATE DATABASE [Orig]

        ON PRIMARY ( NAME = N'Orig', FILENAME = N'D:\Orig.mdf')

GO

 

USE [Orig]

GO

 

IF OBJECT_ID('dbo.TestTable', 'U') IS NOT NULL

        DROP TABLE dbo.TestTable

GO

 

--@@ 사용자 테이블 생성

CREATE TABLE dbo.TestTable (Col1 int)

GO

 

IF OBJECT_ID('dbo.UpdView', 'V') IS NOT NULL

        DROP VIEW dbo.UpdView

GO

 

--@@ 생성

CREATE VIEW dbo.UpdView

AS

SELECT Col1

FROM Orig.dbo.TestTable   

GO

 

--@@ 테스트 데이터 입력

INSERT INTO dbo.TestTable (Col1) VALUES (1)

GO

 

IF DB_ID('Orig_Snapshot') IS NOT NULL

        DROP DATABASE [Orig_Snapshot]

GO

 

--@@ 스냅샷 생성

CREATE DATABASE [Orig_Snapshot]

        ON PRIMARY ( NAME = N'Orig', FILENAME = N'D:\Orig_Snapshot.ss') AS SNAPSHOT OF [Orig]   

GO



2. 테스트 진행

--@@ 스냅샷 데이터베이스로 이동

USE [Orig_Snapshot]

GO


--@@ 현재 데이터 확인

SELECT * FROM dbo.UpdView

GO

 

 

--@@ 데이터 입력

INSERT INTO dbo.UpdView VALUES (2), (3);
GO


--@@
데이터 변경

UPDATE dbo.UpdView SET Col1 = 99 WHERE Col1 = 3;
GO


 

--@@ 데이터 삭제

DELETE FROM dbo.UpdView

WHERE Col1 = 1;
GO

 

-- @@ 데이터 변경내용 조회

SELECT * FROM dbo.UpdView;

GO

 

3. 결론/의견
  > View 구문 내에 데이터베이스명을 적어준 부분으로 인하여 이러한 현상이 발생하는 것입니다.
     뷰를 만들 때 from 절에 데이터베이스명을 명시해주면 스냅샷 데이터베이스에서 뷰를 조회하더라도
     실제 DB에서 데이터를 가지고 옵니다. (당연히도)
  > 프로시져도 마찬가지로 동작할 것이기 때문에 스냅샷 데이터베이스를 사용할 경우 주의가 필요할 것 같습니다.
  > 잘 사용하면 스냅샷 데이터베이스 활용성을 높일 수 있는 반면에 이해가 없이 사용할 경우 문제가 되어질 수
     있으니 알아두시는 것이 좋을 듯 합니다.


출처. Successfully execute an INSERT, UPDATE and DELETE against a Database Snapshot