5

Tôi có một cơ sở dữ liệu chứa rất nhiều bảng có cột Identity được đặt thành [NOT FOR REPLICATION]. trong SQL Server 2008 R2 Có cách nào để tôi có thể loại bỏ ràng buộc này khỏi tất cả các bảng từ Management Studio hoặc bất kỳ truy vấn nào.Xóa [NOT FOR REPLICATION] khỏi tất cả các cột Identity của các bảng cơ sở dữ liệu

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

Tôi đã thử cách này nhưng xóa từng cái một.

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

Trả lời

9

Microsoft cung cấp quy trình lưu trữ hệ thống để bật và tắt cài đặt NOT FOR REPLICATION. Quy trình được lưu trữ là sys.sp_identitycolumnforreplication. Chúng ta có thể sử dụng hệ thống thủ tục lưu trữ này cùng với sp_msforeachtable để loại bỏ các KHÔNG CHO thiết lập sao chép từ tất cả các bảng:

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

Cảm ơn. Trong trường hợp của tôi ở trên đã không giải quyết vấn đề, lệnh này sẽ loại bỏ nhân rộng từ các bảng cơ sở dữ liệu nếu cơ sở dữ liệu nhân rộng được sao chép và đính kèm. Tôi giải quyết vấn đề của mình bằng cách vào nút Management Studio> Replication> Local Publications và bỏ chọn bản sao từ cơ sở dữ liệu của tôi. – Zeeshanef

+0

Cảm ơn - điều này sẽ xóa 'NOT FOR REPLICATION' trên db cục bộ của tôi, nhưng không hoạt động trên Azure db. Có ý tưởng nào không? – Ian

1

tôi thấy sys.sp_identitycolumnforreplication mà không làm việc trong Ent của tôi. SQL 2008R2 hoặc SQL 2012 trường hợp (wil thử nghiệm trong năm 2016 tiếp theo). Đoạn mã nhỏ này làm việc cho tôi. Đặt @debug như bạn thấy phù hợp, để chạy nó hoặc sao chép-dán-chạy.

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

hoạt động cho tất cả các phiên bản của máy chủ SQL và phải là câu trả lời tốt nhất. Cảm ơn kịch bản Abelian – kuklei

Các vấn đề liên quan