Maystyle :
Admin : New post
Guestbook
Local
media
Catergories
Recent Articles
Recent Comments
Recent Trackbacks
Calendar
Tag
Archive
Link
Search
 
  replication 을 완전히 삭제하고 싶다면... 
작성일시 : 2008. 5. 29. 18:17 | 분류 : SQL Server/Administration

이전에 지웠다고 다 지운 리플리케이션 정보 중 일부가 sys.columns 에 아직도 남아 있어 삭제하는 일을 했습니다.
혼자 기억하기는 아쉬워서 남겨 봅니다.

[현상]
컬럼의 길이 등을 변경하거나, sp_rename 을 실행할 때 아래와 같은 메시지가 뜨면서 변경에 실패한다.
Msg 4928, Level 16, State 1, Procedure sp_rename, Line 520
Cannot alter column '<column-name>' because it is 'REPLICATED'.

[원인]
Replication 또는 이전에 설정해 놓은 Replication 설정이 남아 있어 발생한다.
아래와 같이 sys.columns의 is_replicated 및 is_merge_published is_dts_replicated의 칼럼값을 확인 하여 설정 여부를 확인 할 수 있습니다. 제가 경험했던 케이스의 경우에는  is_non_sql_subscribed 칼럼이 1로 설정이 되어 해당 컬럼에 대한 변경이 불가능했었습니다.

[Action Item]
아래 3가지 쿼리를 통해 replication의 설정 여부를 확인 할 수 있습니다.
DB replication 설정 여부 확인 : select is_published, * from sys.databases
Table의 게시 여부 여부 확인 : select is_published, * from sys.objects where is_published=1
Column의 게시 여부 확인 : select * from sys.columns where object_id = object_id('Table 명')

replication이 걸려 있음을 확인 했다면 해당 설정을 삭제 해 줍니다.
sp_msunmarkreplinfo 을 통해 특정 테이블에 대한 게시 정보를 삭제를 할 수 있습니다.
하지만 쉽지 않더군요...

제가 이전에 사용했던 방법은 sp_removedbreplication  인데, 실제로 데드락으로 인해 실패하는 경우가 많아 모든 정보를 지우는데 실패한 경험이 있습니다. 해당 프로시저에 대해서는 이전 포스트(http://maystyle.tistory.com/348)를 참조하시면 됩니다.

마지막으로 제가 선택한 방법은 sp_MSarticlecol 였습니다. 해당 내용은 SSIS, DTS 쪽 블로그를 통해서 확인 할 수 있습니다.

먼저 더미 replication을 만듭니다.
다음으로 게시 정보의 ID를 확인 합니다.
exec sp_helparticle 'replication 이름'

그런 다음 cmd 창을 열어 sql DAC 모드로 연결 합니다.
C:>sqlcmd -A -S'서버명'

마지막으로 is_non_sql_subscribed 의 값을 0으로 설정하기 위해 다음 쿼리를 수행 합니다.
1) EXEC sys.sp_MSarticlecol @artid='위에서 확인한 리플리케이션의 article id', @colid=NULL, @type='nonsqlsub', @operation='drop';
2) go

[기타 정보 확인을 위해 사용 했던 쿼리]
sp_help, select * from sys.objects where type='u'

[출처]
Microsoft 기술 지원 엔지니어 분 및 SSIS 팀 블로그
http://blogs.msdn.com/mangeshd/archive/2008/05/22/altering-properties-of-a-column-fails-with-cannot-alter-column-column-name-because-it-is-replicated.aspx

|