5

Ich habe eine Datenbank, die viele Tabellen mit Identity-Spalten enthält, die auf [NOT FOR REPLICATION] festgelegt sind. in SQL Server 2008 R2 Gibt es eine Möglichkeit, dass ich diese Einschränkung aus allen Tabellen aus Management Studio oder eine beliebige Abfrage entfernen kann danke.Entfernen Sie [NICHT FÜR REPLIKATION] aus allen Identity-Spalten der Datenbanktabellen

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

Ich habe dies versucht, aber es ist eins nach dem anderen entfernen.

ALTER TABLE dbo.tblAttendance ALTER COLUMN Id 
     DROP NOT FOR REPLICATION; 

Antwort

9

Microsoft stellt eine gespeicherte Systemprozedur zum Ein- und Ausschalten der Einstellung NOT FOR REPLICATION bereit. Die gespeicherte Prozedur ist sys.sp_identitycolumnforreplication. Wir können dieses System gespeicherte Prozedur zusammen mit sp_msforeachtable die NOT FOR REPLICATION Einstellung von allen Tabellen zu entfernen:

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

Danke. In meinem Fall wurde das Problem durch Obiges nicht gelöst. Dieser Befehl wird die Replikation aus den Datenbanktabellen entfernen, wenn die replizierte Datenbank kopiert und angehängt wurde. Ich löste mein Problem, indem ich im Knoten Management Studio> Replikation> Lokale Publikationen die Replikation aus meiner Datenbank deaktivierte. – Zeeshanef

+0

Danke - das entfernt 'NOT FOR REPLICATION' auf meiner lokalen Datenbank, funktioniert aber nicht auf der Azure Datenbank. Irgendeine Idee wie? – Ian

1

Ich fand, dass sys.sp_identitycolumnforreplication nicht in meinem Ent funktionierte. SQL 2008R2- oder SQL 2012-Instanzen (wird im nächsten Jahr getestet). Dieser kleine Ausschnitt funktionierte für mich. Stellen Sie @debug so ein, wie Sie es für richtig halten, um es auszuführen, oder kopieren-einfügen-ausführen.

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

dies funktioniert für alle Versionen von SQL Server und sollte die beste Antwort sein. Danke für das Skript Abelian – kuklei