SQL Server 2008 R2 Sao chép giao dịch Có thể chèn giá trị rõ ràng cho cột nhận dạng


7

Hiện tại tôi đang gặp "khủng hoảng danh tính" với sao chép giao dịch trong SQL Server 2008 R2. Cơ sở dữ liệu đang chạy tương thích 90. Có một bảng có cột nhận dạng và sẽ không sao chép lại. Lỗi là "Không thể chèn giá trị rõ ràng cho cột nhận dạng trong bảng '' khi IDENTITY_INSERT được đặt thành TẮT. (Nguồn: MSSQLServer, Số lỗi: 544)".

"Không cho sao chép" được đặt thành đúng cho bảng đó. Tôi không thể tìm thấy bất kỳ cài đặt nào cho các bài viết để xác định điều này là tốt.

Bất kỳ ý tưởng được đánh giá cao.

Câu trả lời:


7

Chỉ cần thêm rằng bạn không phải bỏ và tạo lại bản sao chỉ để thay đổi bit "không cho sao chép".

Bạn có thể làm điều đó bằng T-SQL mà không tạo ảnh chụp nhanh hoặc phá vỡ bản sao của bạn -

sys.sp_identitycolumnforreplication

1 = không cho nhân rộng

0 = để nhân rộng và điều này gây ra sự cố với các dấu hiệu nhận dạng ở phía thuê bao

Để thay đổi nó cho tất cả các bảng:

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

Để thay đổi nó chỉ cho 1 bảng, trước tiên hãy tìm hiểu object_id của bảng và sau đó chạy bên dưới

EXEC sys.sp_identitycolumnforreplication table_object_id, 1

BIÊN TẬP

Dưới đây tsql sẽ cung cấp cho bạn một đầu ra đẹp với lệnh có thể được xem xét trước khi chạy cho toàn bộ cơ sở dữ liệu:

if exists (select 1 from sys.identity_columns where is_not_for_replication = 0)
begin
SELECT  QUOTENAME(SCHEMA_NAME(t.schema_id)) as SchemaName,  
        QUOTENAME(t.name) AS TableName, 
        c.name AS ColumnName,
        c.object_id as ObjectID,
        c.is_not_for_replication,
        'EXEC sys.sp_identitycolumnforreplication '+cast(c.object_id as varchar(20)) + ', 1 ;' as CommandTORun_SetIdendityNOTForReplication
    FROM    sys.identity_columns AS c 
        INNER JOIN  sys.tables AS t ON t.[object_id] = c.[object_id]
        WHERE   c.is_identity = 1
        and c.is_not_for_replication = 0
end
else 
print 'There are no identity columns that needs NOT FOR REPLICATION set to 1'

Đối với cơ sở dữ liệu mạo hiểm:

nhập mô tả hình ảnh ở đây


1
Tôi không chắc chắn nếu đề cập đến việc chúng ta cần áp dụng điều này cho cả DB, Nhà xuất bản và Người đăng ký. Cảm ơn, câu trả lời của bạn đã giúp chúng tôi tiết kiệm thời gian quý báu.
setzamora

1
Kin lại giải cứu! Trong trường hợp của tôi, sp_msforeachtablekhông có sẵn (Azure) mà không có triển khai tùy chỉnh. Vì vậy, tôi chỉ sao chép tất cả các ObjectIDtừ truy vấn cuối cùng và thực hiện một số chỉnh sửa nhiều dòng trong Sublime.
pimbrouwers

3

Làm cho các kích hoạt trên thuê bao không phải để sao chép và đảm bảo rằng cột nhận dạng trên thuê bao được đánh dấu là không sao chép. Điều này sẽ chăm sóc vấn đề.


1
Cảm ơn! Tôi chắc chắn rằng nó được đặt thành "không cho sao chép". Tôi đã kết thúc việc thả và tạo lại bản sao. Bây giờ nó hoạt động. Đi hình.
dùng728263
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.