DataBase/MS-SQL2009.01.09 15:39

[뷰의 이해와 생성하기]

~ 뷰 란 한마디로 말하면 존재하지 않는 테이블이다. 특정한 데이터베이스 내에 존재하는

  하나 이상의 테이블에서 사용자가 얻기 원하는 데이터들만 정확하고 편하게 가져오기

  위하여 사전에 원하는 컬럼만을 모아서 만들어 놓은 가상의 테이블을 말한다.

  가상의 테이블이란 말은 뷰가 실제로 존재하는 테이블이 아니라 하나 이상의 테이블에서

  파생된 또 다른 정보를 볼 수 있는 방법이며 그 정보들을 추출해내는 SQL문장이라고도

  볼 수 있다.


<뷰의 장점 혹은 목적>

1.사용자에게 편의성을 제공한다. 사용자가 원하는, 사용자에게 필요한 정보만을

   사용자의 요구에 맞게 제공해준다. 즉, 뷰를 처음 만들 때 테이블들과 컬럼들 간의

   복잡한 관계 같은 것들을 미리 정의하여 놓기만 하면 일반 사용자들은 그 생성된 뷰를

   마치 일반 테이블을 다루듯이 사용 가능 한 것이다.

 

2.뷰는 자주 사용되는 질의를 미리 정의해둠으로써 사용자가 작업을 실행할 때마나

  여러 조건들을 지정해야만 하는 불편을 해소할 수 있다.(ex: JOIN 문 같은 경우)

3.뷰는 데이터의 보안과 관련하여 특정 사용자에게 필요한 데이터를 선별적으로 보여줄 수 있다.

   이 말인 즉슨 어떤 특정한 사용자나 그룹에게 특정 데이터를 보여주고 싶지 않을 때(보안!!)

   상당히 유용하다는 말이다.


<뷰의 생성>

CREATE VIEW 뷰이름

[WITH ENCRYPTION]

AS

        SELECT_stateme

[WITH CHECK OPTION]


[WITH ENCRYPTION]: 생성된 뷰에 대하여 수행되는 모든 질의 문장들이 해당 뷰를 정의하는

                     SELECT 문의 조건들을 지키도록 하는 옵션

[WITH CHECK OPTION]: 뷰를 생성하는 텍스트 구문을 사용자가 볼 수 없도록 하는 옵션.


제약조건)

1.뷰의 사용자는 뷰의 정의에서 사용되는 객체들에 대한 SELECT 권한을 가지고 있어야만 한다.

2.뷰의 정의에서 사용되는 SELECT문은

  SELECT INTO, ORDER BY, COMPUTE, COMPUTE BY 문을 사용할 수 없다.

   *단 Select 구문에 top이 따라올경우 order by가 사용가능하다.

3.임시 테이블에 대해서는 뷰를 생성할 수 없다.


<뷰와 시스템 테이블과 정보>

sp_helptext 뷰이름       뷰를 생성하는 데 사용한 텍스트를 보여 준다

sp_depends 뷰이름       뷰가 종속되어 있는 테이블과 뷰의 정보를 보여준다.


<뷰의 수정과 삭제>

수정: ALTER VIEW 뷰이름 [WITH ENCRYPTIOM]

                AS 

                select_stateme [WITH CHECK OPTION]

삭제: DROP VIEW 뷰이름

 

<뷰에 대한 정보 보기와 WITH ENCRYPTION>

~ 이미 생성된 뷰의 정의를 보안상의 문제 등으로 남들에게 공개하고 싶지 않을 경우.


WITH ENCRYPTION(뷰를 암호화 하기)

~ 뷰의 오브젝트가 되는 테이블의 내부 구조를 보안 등의 이유로 WITH ENCRYPTION을

  사용하게 되는데 이 옵션은 뷰의 정의를 암호화 하여 저장하기 때문에 사용자들 뿐만

  아니라 개발자 역시도 뷰의 내부 정의를 볼 수 없게 된다.

ex)

create view testview5 with encryption

as select title_id, title, type, price from titles where price >= 15


뷰를 통해 하나 이상의 테이블을 수정하는 경우

~ 뷰를 통한 데이터의 수정,입력(입력되지 않은 다른 테이블의 필드는 null 값이 들어간다.

  =>default로 처리하자!)은 한번에 두 개 이상의 테이블에 영향을 미칠 수 없다. 뷰를

  통해서는 한번의 질의에 하나의 테이블만 수정,입력 할 수 있다.

ex)

create view testview3 as

select a.이름, 관계, 휴대폰번호, 차명, 년식

from 개인신상 a, 자동차 b where a.이름 = b.이름


insert into testview3

values ('김성균', '동기', '(017)888-8888', '소나타', '2000')   

/*옆의 문장은 표면상으로는 전혀 오류가 없으나 view는 한번의 질의에 하나의 테이블만

  수정할 수 있기에 옆의 view는 두개의 테이블을 join하여 생성되었기 때문이다.*/


insert into testview3 (이름, 관계, 휴대폰번호)

values ('김성균', '동기', '(017)888-8888')

옆의 구문은 한테이블의 컬럼만 내용을 입력하였기 때문에 오류없이 실행이 된다

 

WITH CHECK OPTION

~ 일정한 조건에 의해 만들어진 뷰에서의 데이터 수정이 있을 경우 뷰를 생성할 때와

  동일한 조건을 수정해도 적용시켜야 할 때 사용된다.

ex)

create table p_tbl(id varchar(10),price int)

insert into p_tbl values ('a', 15)

insert into p_tbl values ('b', 14)

insert into p_tbl values ('c', 12)

insert into p_tbl values ('d', 16)

insert into p_tbl values ('e', 17)


create view b_tbl as select * from p_tbl where price >= 15 with check option

select * from b_tbl /*체크옵션으로 price가 15보다 크거나 작아야 하므로 이 조건을 충족

                                  시키지 못하면 수정 할 수가 없다*/

update b_tbl set price =10 where id = 'a'

에러구문): 서버: 메시지 550, 수준 16, 상태 1, 줄 1

대상 뷰가 WITH CHECK OPTION을 지정하거나 WITH CHECK OPTION을 지정하는 뷰에 걸쳐 있고 해당 연산의 하나 이상의 결과 행이 CHECK OPTION 제약 조건을 충족하지 않았으므로 삽입 또는 업데이트 시도가 실패했습니다.

 

<분산 분할 뷰 (파티션드:partitioned 뷰)>

1. 테이블을 행 분할한 뒤 여러 개의 서버에 분산 시키고 이를 마치 하나의 서버에 있는

  테이블처럼 사용하는 것을 말한다.

2. 사용자의 프로세스가 여러 개의 서버에서 동시에 수행됨으로 대용량 데이터베이스에 대한

  솔루션이 될 수 있다.


[파티션드 뷰 만들기]

1) 연결된 서버를 구성한다 (SP_ADDLINKEDSERVER)

2) 레코드로 분리한 테이블을 각 연결된 서버의 데이터베이스에 만든다.

   이때 각 테이블에는 check 제약 조건을 정의 해서 각각의 테이블에 데이터가 서로 중복

   되지 않게 해야한다.

3) 연결된 서버간의 동일한 이름의 파티션드 뷰를 작성한다.


: 그냥 알아두도록 하자

~ UNION이란 여러 개의 select 문장을 단일한 결과 셋으로 묶어주는 역할을 한다.

  일반적으로 정규화를 할 경우 테이블을 컬럼을 기준으로 분리 하지만 역정규화를

  할 때 레코드를 기준으로 분리하는 경우 분리된 테이블의 레코드들을 하나의 결과 셋으로

  조회할 때 UNION을 사용한다.

UNION: 여러 결과 셋(집합)을 하나로 묶지만 중복된 데이터는 제거한다.

UNION ALL: 여러 결과 셋(집합)을 하나로 묶으면서 중복된 데이터를 제거하지 않는다.

 

Posted by 개발자곰탱이