- /**********************************************************************************************
-- 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.
*/
[2k5] FK 제약 조건이 있는 클러스터드 인덱스 비활성화한 후, 활성화하기
2008. 9. 7. 11:51