SQL Server 2005는 DDL 트리거에서 DOS 배치 파일을 비동기로 호출하도록하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/802398

문제

SQLMetal을 실행하고 LINQ2SQL 데이터 클래스를 생성하고 빌드 트리거 트리거 등을 체크인하는 배치 파일을 만들었습니다. SQL Server 2005에서 DDL 변경이있을 때 마다이 스크립트를 실행하고 싶습니다.

XP_CMDSHELL을 통해 배치 파일을 실행하는 것은 다음과 같이 트리거 밖에서 잘 작동합니다.

exec master..xp_cmdshell 'd:\dev\db_triggers\generatedataclasses.bat', no_output

그러나 트리거로 실행되면 항상 데이터베이스에 연결하는 시간이 걸려 모든 DDL이 실패합니다. 내 방아쇠는 다음과 같습니다.

CREATE TRIGGER [Trig_SqlMetal]
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS 
AS
exec master..xp_cmdshell 'd:\dev\db_triggers\generatedataclasses.bat', no_output

두 가지 요점에 대한 조언을 찾고 있습니다.

  1. 이 일을하십시오. 어떤 이유로 든 방아쇠에있을 때는 항상 실패하며 방아쇠에 있지 않을 때는 그렇지 않습니다. 두 경우 모두 로컬 시스템으로 실행되기 때문에 보안과 관련된 것으로 보이지 않습니다.
  2. SQLMetal의 고장 및 시간 초과가 DDL 업데이트 고장을 일으키지 않도록이를 비스듬히 만듭니다. 배치 파일을 다른 사람과 "시작 cmd.exe /c otherbatch.bat"로 래핑하려고 시도했지만 SQL Server를 통해 실행하면 시작을 무시하는 것 같습니다 (DOS에서 잘 작동합니다). 나는 확실히 일부 테이블과 픽업 이벤트를 볼 수있는 폴링 프로세스를 작성할 수 있지만, 나는 이것이 덜 복잡하게 만드는 트리거를 선호합니다 (또는 반대입니다 :)).
도움이 되었습니까?

해결책

배치는 생성되는 테이블에 대한 데이터를 쿼리하려고 시도하기 때문에 차단 될 수 있지만 트랜잭션 내부에서 여전히 잠겨 있습니다 (트리거는 DDL/DML 문에 대해 SQL Server가 시작하는 암시 적 트랜잭션의 일부입니다). 트리거가 끝난 후. 내가 아는 SQL Server 2005 이상에서 비동기 실행의 유일한 실용적인 방법은 서비스 브로커입니다. "서비스 브로커 내부 활성화"를 찾으십시오. 실제로 제대로 설정하는 것은 약간 복잡하므로 풀링 옵션을 선택할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top