SQL Server 가 원 격 데이터 베 이 스 를 실시 간 으로 업데이트 하 는 데 발생 하 는 문제 요약
                                            
 6200 단어  sqlserver동기 업데이트원 격 데이터베이스
                    
태 블 릿 A 는 태 블 릿 B 와 구조 가 같 지만 데이터 수량 이 꼭 같 지 않 아 태 블 릿 C 도 태 블 릿 B 를 업데이트 할 가능성 이 있 는 것 으로 보인다.데이터 업데이트 가 잦 지 않 아,쉽게 생각 하기 위해 트리거 Tirgger 를 사 용 했 습 니 다.발생 한 몇 가지 문 제 를 기록 하 세 요.
1.타지 데이터베이스 방문
ServerA 에 ServerB 를 가리 키 는 링크 서버 를 만 들 고 계 정 맵 을 만 듭 니 다.addlinkedserver 저장 과정 에서 링크 서버 를 만 듭 니 다.매개 변 수 는 공식 문 서 를 참조 하 십시오.첫 번 째 파라미터 LNKServerA 는 사용자 정의 이름 입 니 다.두 번 째 매개 변수 제품 이름 은 SQL Server 가 제공 하지 않 아 도 됩 니 다.세 번 째 매개 변 수 는 구동 유형 입 니 다.네 번 째 매개 변 수 는 데이터 원본 입 니 다.여기에 SQL Server 서버 주 소 를 쓰 십시오.
exec sp_addlinkedserver 'LNK_ServerB_DatabaseB','','SQLNCLI','172.16.8.101'
exec sp_addlinkedsrvlogin 'LNK_ServerB_DatabaseB','false',null,'user','password'
exec sp_droplinkedsrvlogin 'LNK_ServerB_DatabaseB',null
exec sp_dropserver 'LNK_ServerB_DatabaseB','droplogins' 
 주의해 야 할 것 은 상기 두 개의 저장 과정 이 트리거 코드 에 나타 나 지 않 고 서버 ServerA 에서 미리 설정 을 실행 해 야 한 다 는 것 이다.그렇지 않 으 면 트리거 암시 적 업무 에 대한 요구 가 잘못 보 고 될 것 이다."The procedure'sys.spaddlinkedserver' cannot be executed within a transaction.”
2.분산 트 랜 잭 션 설정
SQL Server 의 트리거 는 암시 적 으로 사 무 를 사용 합 니 다.링크 서버 는 원 격 서버 입 니 다.로 컬 서버 와 원 격 서버 사이 에 분포 식 트 랜 잭 션 처 리 를 켜 야 합 니 다.그렇지 않 으 면"The partner transaction manager has disabled its support for remote/network transactions"의 오류 가 발생 합 니 다.저 는 ServerA 와 ServerB 에서 분포 식 트 랜 잭 션 코 디 네 이 터 를 켜 고 분포 식 트 랜 잭 션 을 지원 하기 위해 적당 한 설정 을 했 습 니 다.ServerA 와 ServerB 는 모두 Windows Server 2012 R2 로 다른 버 전 서버 와 유사 하 다.
(1)먼저 Services.msc 에서 Distributed Transaction Coordinator 가 켜 져 있 는 지 확인 합 니 다.다른 버 전의 서버 가 기본 으로 설치 되 어 있 지 않 습 니 다.windows features 를 설치 하 는 방식 으로 이 기능 을 먼저 설치 해 야 합 니 다.
 
 (2)서버 관리 도구 Administrative Tools 에서 Component Services 를 찾 습 니 다.Local DTC 에서 속성 Security 옵션 카드 에 다음 과 같이 설정 되 어 있 습 니 다.관련 보안 설정 을 열 면 서 비 스 를 다시 시작 합 니 다.서버 를 다시 시작 해 야 한 다 는 문서 도 있 지만 2012 R2 는 사용 하지 않 습 니 다.
 
 (3)방화벽 설정,인 바 운 드 와 아웃 바 운 드 모두 열기
 
 3.데이터베이스 필드 text,ntext 처리
업무 중 테이블 A 에 있 는 Content 필드 는 text 형식 으로 테이블 B 에 동기 화 할 때 내용 을 교체 처리 해 야 합 니 다.text 형식 은 유행 이 지난 유형 입 니 다.마이크로소프트 는 공식 적 으로(N)VARCHAR(MAX)로 교체 하 는 것 을 권장 합 니 다.여 기 를 찾 아 볼 수 있 습 니 다.앞으로 디자인 할 때 고려 할 수 있 습 니 다.여기 서 우 리 는 text 를 처리 하 는 것 을 고려 할 수 있 습 니 다.
그러나 트리거 에 서 는 inserted 와 deleted 표 가 text/ntext/image 형식 을 처리 할 수 없습니다.여기에서 저 희 는 곡선 으로 나 라 를 구 하 는 방법 을 사용 하여 데이터베이스 에서 기록 을 임시 표 로 읽 은 다음 에 textptr 와 patindex 함수 와 updatetext 명령 을 통 해 문자열 교체 처 리 를 완성 합 니 다.
if exists(select * from tempdb..sysobjects where id=object_id('tempdb..#temp_tablea')) 
 drop table #temp_tablea
select * into #temp_tablea from TableA where ID = @ID
declare @s varchar(200),@d varchar(200)
select @s='="/_target/',@d='="/_replacement/'
declare @p varbinary(16),@postion int,@l int
select @p=textptr(Content),@l=len(@s),@postion=patindex('%'+@s+'%',Content)+1 from #temp_tablea
while @postion>1
begin
 updatetext #temp_tablea.Content @p @postion @l @d
 select @postion=patindex('%'+@s+'%',Content)+1 from #temp_tablea
end링크 서버 를 설정 할 때 원 격 데이터베이스 테이블 에 직접 접근 할 수 있 습 니 다.다음 과 같 습 니 다.
insert into LNK_ServerB_DatabaseB.DatabaseB.dbo.TableB ...
update LNK_ServerB_DatabaseB.DatabaseB.dbo.TableB set ...
declare @sql nvarchar(500), @Name nvarchar(50),@ID nvarchar(40)
set @SQL=N'select @Name=Name from LNK_ServerB_DatabaseB.DatabaseB.dbo.TableB where ID=@ID'
exec sp_executesql @SQL,N'@Name nvarchar(50) output,@ID nvarchar(40)',@Name output,@ID
declare @SQL nvarchar(500),@Name nvarchar(50),@Count int,@ID nvarchar(40)
set @Name=N'Cat'
set @Count=0
set @ID=N'{00000000-0000-0000-0000-000000000000}'
set @SQL=N'update TableA set Name='''+@Name+''', Count='+@Count+' where ID='''+@ID+''''
exec(@SQL)
set @SQL=N'update TableA set Name=@Name,Count=@Count where ID=@ID'
exec sp_executesql @SQL, N'@Name nvarchar(50),@Count int,@ID nvarchar(40)',@Name,@Count,@ID이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
깊이 중첩된 객체를 정확히 일치 검색 - PostgreSQL목차 * 🚀 * 🎯 * 🏁 * 🙏 JSON 객체 예시 따라서 우리의 현재 목표는 "고용주"사용자가 입력한 검색어(이 경우에는 '요리')를 얻고 이 용어와 정확히 일치하는 모든 사용자 프로필을 찾는 것입니다. 즐거운 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.