5

ID 열이있는 테이블이 많이 포함 된 데이터베이스가 [REPLICATION NOT]으로 설정되어 있습니다. SQL Server 2008 R2 Management Studio 또는 모든 쿼리 감사에서이 제약 조건을 모든 테이블에서 제거 할 수있는 방법이 있습니까?데이터베이스 테이블의 모든 ID 열에서 [NOT FOR REPLICATION]을 제거하십시오.

Create Table mytbl (
[EmpId] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL, 

시도했지만 하나씩 제거 중입니다.

답변

9

Microsoft는 NOT FOR REPLICATION 설정을 설정하거나 해제하는 시스템 저장 프로 시저를 제공합니다. 저장 프로시 저는 입니다. sys.sp_identitycolumnforreplication입니다. 우리는 모든 테이블에서 복제 설정에 대한 NOT을 제거 sp_msforeachtable와 함께이 시스템 저장 프로 시저를 사용할 수 있습니다

EXEC sp_msforeachtable @command1 = ' 
declare @int int 
set @int =object_id("?") 
EXEC sys.sp_identitycolumnforreplication @int, 0' 
+0

감사합니다. 위의 경우 문제가 해결되지 않았지만 복제 된 데이터베이스가 복사되어 첨부 된 경우이 명령은 데이터베이스 테이블에서 복제를 제거합니다. Management Studio> 복제> 로컬 게시 노드로 이동하여 내 데이터베이스에서 복제를 선택 취소하여 문제를 해결했습니다. – Zeeshanef

+0

감사합니다 - 내 로컬 db에서 NOT FOR REPLICATION을 제거하지만 Azure db에서는 작동하지 않습니다. 어떤 생각? – Ian

1

그 sys.sp_identitycolumnforreplication 내 엔트에서 작동하지 않았다 발견했다. SQL 2008 R2 또는 SQL 2012 인스턴스 (다음에 2016 년에 wil 테스트). 이 작은 조각은 나를 위해 일했다. @debug를 적절하게 설정하여 실행하거나 복사하여 붙여 넣기를 실행하십시오.

set nocount on 
declare @loop int = 1, @debug bit = 1, @schema sysname, @table sysname, @column sysname, @status int, @sqlStatement nvarchar(1000) 
declare repl_cursor cursor for 
SELECT 
     [schema] = object_schema_name([object_id]) 
    , [table] = object_name([object_id]) 
    , [column] = [name] 
    , IsIdNotForRepl = COLUMNPROPERTY([object_id], [name], 'IsIdNotForRepl') 
    , [--script] = 'alter table [' + object_schema_name([object_id]) + '].[' + object_name([object_id]) + '] alter column [' + [name] + '] DROP NOT FOR REPLICATION' 
FROM sys.columns 
     WHERE 1=1 
     and COLUMNPROPERTY([object_id], [name], 'IsIdNotForRepl') = 1 
     and object_schema_name([object_id]) <> 'sys' 
order by 1,2 

open repl_cursor 
fetch next from repl_cursor into @schema, @table, @column, @status, @sqlStatement 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    print '--loop: ' + cast(@loop as varchar(3)) + '; table: [' + @schema + '].[' + @table + '].[' + @column + ']; status = ' + case when isnull(@status,3) = 3 then 'NULL' else cast(@status as varchar(2)) end 
    print @sqlStatement + char(10) 

    if @debug = 0 exec(@sqlStatement) 

    FETCH NEXT FROM repl_cursor into @schema, @table, @column, @status, @sqlStatement 
    set @loop +=1 
END 

close repl_cursor 
deallocate repl_cursor 
go 
+0

이것은 모든 버전의 SQL 서버에서 작동하며 가장 좋은 대답이어야합니다. 스크립트 Abelian 주셔서 감사합니다. – kuklei

관련 문제