2010. 11. 3. 11:33
SQL SERVER
declare foreignkey_make_cursor cursor for
select name, parent_object_id, referenced_object_id, delete_referential_action, update_referential_action from sys.foreign_keys
declare @foreignkey_name as varchar(100)
declare @current_table_id as int
declare @refrenced_table_id as int
declare @delete_refrencial_action as tinyint
declare @update_refrencial_action as tinyint
open foreignkey_make_cursor
fetch next from foreignkey_make_cursor into @foreignkey_name, @current_table_id, @refrenced_table_id, @delete_refrencial_action, @update_refrencial_action
while (@@fetch_status = 0)
begin
declare @result_query as varchar(3000)
set @result_query ='alter table ' + object_name(@current_table_id)
set @result_query = @result_query + ' add constraint ' + @foreignkey_name + ' foreign key '
set @result_query = @result_query + '('
--foreign key 에 들어갈 column 을 불러오는 커서
declare process_column_cursor cursor for
select b.name from sys.foreign_key_columns as a
inner join sys.columns as b
on a.parent_object_id = b.object_id
and a.parent_column_id = b.column_id
where parent_object_id = @current_table_id
declare @fkcolumn sysname
declare @fkfirstcolumn bit set @fkfirstcolumn = 1
open process_column_cursor
fetch next from process_column_cursor into @fkcolumn
while (@@fetch_status = 0)
begin
if (@fkfirstcolumn = 1)
set @fkfirstcolumn = 0
else
set @result_query = @result_query + ', '
set @result_query = @result_query + @fkcolumn
fetch next from process_column_cursor into @fkcolumn
end
close process_column_cursor
deallocate process_column_cursor
--###########process_column_cursor 커서의 끝###############################
set @result_query = @result_query + ') '
set @result_query = @result_query + 'references ' + object_name(@refrenced_table_id) +'('
--원본테이블에서 참조되고 있는 column 을 불러오는 커서
declare process_rdcolumn_cursor cursor for
select b.name from sys.foreign_key_columns as a
inner join sys.columns as b
on a.referenced_object_id= b.object_id
and a.referenced_column_id = b.column_id
where referenced_object_id = @refrenced_table_id
declare @rdcolumn sysname
declare @rdfirstcolumn bit set @rdfirstcolumn = 1
open process_rdcolumn_cursor
fetch next from process_rdcolumn_cursor into @rdcolumn
while (@@fetch_status = 0)
begin
if (@rdfirstcolumn = 1)
set @rdfirstcolumn = 0
else
set @result_query = @result_query + ', '
set @result_query = @result_query + @rdcolumn
fetch next from process_rdcolumn_cursor into @rdcolumn
end
close process_rdcolumn_cursor
deallocate process_rdcolumn_cursor
--###########process_rdcolumn_cursor 커서의 끝###############################
set @result_query = @result_query + ')'
if(@delete_refrencial_action = 0)
set @result_query = @result_query + ' on delete no action'
else if(@delete_refrencial_action = 1)
set @result_query = @result_query + ' on delete cascade'
else if(@delete_refrencial_action = 2)
set @result_query = @result_query + ' on delete set null'
else if(@delete_refrencial_action = 3)
set @result_query = @result_query + ' on delete set default'
if(@update_refrencial_action = 0)
set @result_query = @result_query + ' on update no action'
else if(@update_refrencial_action = 1)
set @result_query = @result_query + ' on update cascade'
else if(@update_refrencial_action = 2)
set @result_query = @result_query + ' on update set null'
else if(@update_refrencial_action = 3)
set @result_query = @result_query + ' on update set default'
print @result_query
fetch next from foreignkey_make_cursor into @foreignkey_name, @current_table_id, @refrenced_table_id, @delete_refrencial_action, @update_refrencial_action
end
close foreignkey_make_cursor
deallocate foreignkey_make_cursor
'SQL SERVER' 카테고리의 다른 글
모든 테이블에서 varchar, nvarchar 칼럼만 SELECT TOP 1하는 쿼리생성 커서 (0) | 2010.11.03 |
---|---|
디비의 테이블에 있는 모든 Non Clustered Index생성 스크립트 생성 커서 (0) | 2010.11.03 |
SQL SERVER Performance 체크 항목 (0) | 2010.11.03 |
성능모니터(perfmon)에서 체크해야될 사항 (0) | 2010.11.03 |
메모리 병목현상 체크 (0) | 2010.11.03 |