1. /**********************************************************************************************
    -- Title : [2k5] FK 제약 조건이 있는 클러스터드 인덱스 비활성화한 후, 활성화하기
    -- Reference : mcpworld.com
    -- Key word : alter index disable
    **********************************************************************************************/
    use tempdb;
    go

    if objectproperty(object_id('cities'), 'isusertable') = 1
     drop table cities;
    go

    if objectproperty(object_id('states'), 'isusertable') = 1
     drop table states;
    go

    -- 테스트 테이블 생성
    create table states (state char(2) not null);
    go

    create table cities (
       city varchar(30) not null,
       state char(2) ,
          zip int);
    go

    -- pk 제약 조건과 fk 제약 조건 생성
    alter table states
    add constraint pk_states primary key clustered (state);
    go

    alter table cities
    add constraint pk_cities primary key clustered (city);
    go

    alter table cities
    add constraint fk_cities_states_state foreign key (state)
    references states (state);
    go

    -- cities 테이블에 데이터 insert
    -- states 테이블에 없는 ‘pr’ 값은 cities 테이블에 insert 불가능
    insert into states select 'ca';
    go

    insert into cities select 'los angles', 'ca',111;
    go

    insert into cities select 'san juan', 'pr' ,222;
    go
    /*
    메시지 547, 수준 16, 상태 0, 줄 1
    insert 문이 foreign key 제약 조건 "fk_cities_states_state"과(와) 충돌했습니다. 데이터베이스 "tempdb", 테이블 "dbo.states", column 'state'에서 충돌이 발생했습니다.
    문이 종료되었습니다.
    */

    -- states 테이블의 클러스터드 인덱스 비활성화
    -- fk 제약 조건도 동시에 비활성화된다
    alter index pk_states on states
    disable;
    go
    /*
    경고: 인덱스 'pk_states'을(를) 비활성화한 결과 테이블 'states'을(를) 참조하는 테이블 'cities'의 외래 키 'fk_cities_states_state'이(가) 비활성화되었습니다.
    */
     
    -- cities 테이블에 데이터 insert
    -- fk 제약 조건이 비활성화되었으므로
    -- states 테이블에 없는 ‘pr’ 값은 cities 테이블에 insert 가능
    insert into cities select 'san juan', 'pr' ,222;
    go

    -- states 테이블의 클러스터드 인덱스 재구성
    alter index pk_states on states
    rebuild;
    go

    -- cities 테이블에 데이터 insert
    -- fk 제약 조건은 여전히 비활성화 상태이므로
    -- states 테이블에 없는 ‘pr’ 값은 cities 테이블에 insert 가능
    insert into cities select 'detroit', 'pr' ,333;
    go

    -- fk 제약 조건 재생성하기
    alter table  cities
    check constraint fk_cities_states_state;

    -- cities 테이블에 데이터 insert
    -- states 테이블에 없는 ‘pr’ 값은 cities 테이블에 insert 불가능
    insert into cities select 'kenmore', 'pr' ,444;
    go
    /*
    msg 547, level 16, state 0, line 1
    the insert statement conflicted with the foreign key constraint "fk_cities_states_state". the conflict occurred in database "adventureworks", table "dbo.states", column 'state'.
    the statement has been terminated.
    */

+ Recent posts