1

TSQL에서 웹 서비스를 호출하는 가장 좋은 방법은 무엇입니까? 웹 서비스를 호출하는 트리거를 작성하고 싶습니다. 이것에 일반적으로 사용되는 가장 좋은 방법이 있습니까?TSQL에서 웹 서비스를 호출하는 가장 좋은 방법

구현은 SQL 서버에서 처리 될 필요가 2005 년과

+0

의견을 보내 주셔서 감사합니다. –

답변

6

내가들은 모든 것에서 데이터베이스 내의 "어디서나"웹 사이트 호출을하는 것은 "모범 사례"가 아니며 방아쇠를 당겨서 웹 전화를 걸면 나를 기다리게한다 [지연, 지연, 차단, 교착 상태 ...]. 데이터베이스는 훌륭한 백엔드이지만 매우 열악한 프론트 엔드입니다. 아마도 전용 애플리케이션을 사용하여 웹 및 데이터베이스 조정을 수행하는 것이 훨씬 낫습니다.

SQL 에이전트 호출에 무언가를 연결하면 작동하지만 작업 단계 내에서 웹 사이트를 호출 할 수있는 "기본"방법이 없다는 점에 유의하십시오. 그들은 아마도 의도적으로 그렇게 설계했습니다.

6

2008 난 당신이 SQL 서버에 .NET의 CLR 코드를 포함 할 수 있습니다 알고 있지만, CLR 코드가 트리거에서 호출 할 수 있는지, 나도 몰라. 웹 서비스를 호출하고 테이블을 폴링하기 위해 외부 응용 프로그램을 실행하고 거기에서 웹 서비스를 호출 할 필요가있을 때마다 레코드가 삽입 될 하나의 테이블을 가짐으로써 다른 아키텍처에 대해 생각해 보겠습니다. 트리거 내에서 직접 웹 서비스를 호출하려고하면 디버깅, 오류 로깅 등 많은 문제가 발생할 것입니다. 그냥 2 센트입니다.

+3

+1, 나는 SQL 트랜잭션 중간에 웹 서비스에 대한 호출을 던지는 것이 좋은 생각이라고 생각하지 않습니다. 모든 트리거는 실행 문과 함께 자동 트랜잭션에서 실행됩니다. 이 전체 트랜잭션에 대한 잠금과 발사 명령 및 기타 명령에 대한 고유 한 트랜잭션이있는 경우 더 많은 시간을 보류합니다. 트리거를 매우 빠르게 실행해야하거나 시스템 속도가 느려집니다. –

3

이미 언급했듯이 트리거에서 웹 서비스를 호출하면 호출하는 데 걸리는 시간 때문에 데이터베이스 성능이 저하됩니다.

SQL Server에는 SQL Server에 비동기 메시징을 통합하기 위해 설계된 SQL Server Broker이라는 기능이 있습니다. SQL Server 내에서 모든 처리 논리를 유지하려면이 작업을 직접 사용해 본 경험이 있지만 좋은 출발점이 될 수 있습니다.

그러나 나는 데이터베이스를 사용하는 응용 프로그램으로 서비스 호출 책임을 옮기는 것이 좋습니다. 이 레벨에서는 데이터베이스를 묶지 않고 대기 시간을 처리 할 수 ​​있습니다.

1

@ Keith의 대답에서 말한 것처럼 웹 서비스에 대한 전체 호출은 매우 나쁠 수 있습니다. 웹 서비스가 다운되었다고 가정하고 데이터에 액세스하기 위해 많은 업데이트가 잠겨 대기 중입니다. 그래도 SQL Service Broker를 사용할 수 있습니다. here is a good tutorial은 트리거와 함께 사용합니다. 다음은 대기열을 설정 한 후의 샘플 트리거 코드입니다. 언제든지 대기열을 감시하고 실제로 웹 서비스를 호출하는 서비스를 만들 수 있습니다.

--Create trigger for update 
CREATE TRIGGER dbo.Trg_DepartmentMaster_Update 
    ON dbo.DepartmentMaster FOR UPDATE 
AS BEGIN 
    SET NOCOUNT ON; 
    DECLARE @MessageBody XML 
    DECLARE @TableId int 

    --get relevant information from inserted/deleted and convert to xml message 
    SET @MessageBody = (SELECT DepartmentId,Name,Description FROM inserted FOR XML AUTO) 

    If (@MessageBody IS NOT NULL) 
    BEGIN 
     DECLARE @Handle UNIQUEIDENTIFIER; 
     BEGIN DIALOG CONVERSATION @Handle 
     FROM SERVICE [TestServiceInitiator] 
     TO SERVICE 'TestServiceTarget' 
     ON CONTRACT [TestContract] 
     WITH ENCRYPTION = OFF; 
     SEND ON CONVERSATION @Handle 
     MESSAGE TYPE [TestMessage](@MessageBody); 
    END 
END 
관련 문제