복제 커스텀 리졸버는 빈 줄을 널로 변경합니다
-
19-09-2019 - |
문제
다른 데이터베이스에 복제 된 데이터베이스에 게시하는 C# 응용 프로그램이 있으며 (병합 반복 사용) 저장 프로 시저 인 사용자 정의 리졸버가 하나 있습니다.
이것은 SQL Server 2000 하에서 정상적으로 작동했지만 SQL Server 2005에서 테스트 할 때 사용자 정의 Resolver는 빈 Varchar 열을 nulls로 변경하려고 시도합니다 (그리고이 특정 열에 실패하면 널을 허용하지 않습니다).
이러한 바르 차르 필드는 두 데이터베이스에서 현재 비어 있고 변경되지 않았으며 저장된 절차가 변경되지 않기 때문에 충돌을 일으키는 필드가 아닙니다 (수행중인 모든 것은 다른 돈 열의 가치를 설정하려고 시도하는 것입니다). .
누구 든지이 문제를 발견했거나 빈 줄을 그대로 두는 저장된 절차의 예가 있습니까?
실제 저장된 절차는 상당히 간단하고 충돌시 고객 균형을 다시 계산합니다.
ALTER procedure [dbo].[ReCalculateCustomerBalance]
@tableowner sysname,
@tablename sysname,
@rowguid varchar(36),
@subscriber sysname,
@subscriber_db sysname,
@log_conflict INT OUTPUT,
@conflict_message nvarchar(512) OUTPUT
AS
set nocount on
DECLARE
@CustomerID bigint,
@SysBalance money,
@CurBalance money,
@SQL_TEXT nvarchar(2000)
Select @CustomerID = customer.id from customer where rowguid= @rowguid
Select @SysBalance = Sum(SystemTotal), @CurBalance = Sum(CurrencyTotal) From CustomerTransaction Where CustomerTransaction.CustomerID = @CustomerID
Update Customer Set SystemBalance = IsNull(@SysBalance, 0), CurrencyBalance = IsNull(@CurBalance, 0) Where id = @CustomerID
Select * From Customer Where rowguid= @rowguid
Select @log_conflict =0
Select @conflict_message ='successful'
Return(0)
해결책
여기에는 몇 가지 옵션이 있습니다. 각 연구가 SQL Server의 문제라는 연구 결과에서 각각 약간의 해결 방법입니다.
1-이 진술 변경 : Select * From Customer Where rowguid= @rowguid
각 열을 명시 적으로 언급하고 불쾌한 필드에 "isnull"을 사용하려면
2- 테이블의 열을 변경하여 ''에 대한 기본 제약 조건을 추가하십시오. 이것이 무엇을 할 것인가, '널'을 삽입하려고하면 빈 줄로 대체됩니다.
3- 삽입 전에 데이터를 변경하여 더 이상 '널'을 포함하지 않도록 '삽입 전'트리거를 추가하십시오.
추신 : 복제 시스템에 해당 열이 "필수"로 표시되어 있다는 것이 긍정적입니까? 필요하지 않은 경우 데이터가 없으면 'NULL'을 삽입 할 것입니다.