SQL CLR 트리거가 이것을 할 수 있습니까? 아니면 더 좋은 방법이 있습니까?

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

문제

데이터베이스 테이블을 모니터링하는 서비스 (아마도 C#)를 작성하고 싶습니다. 레코드가 테이블에 삽입되면 새로 삽입 된 데이터를 가져 와서 복잡한 비즈니스 로직 (TSQL의 경우 너무 복잡함)을 수행하기를 원합니다.

한 가지 옵션은 서비스가 정기적으로 테이블을 확인하여 새 레코드가 삽입되었는지 확인하는 것입니다. 그런 식으로 수행하는 문제는 서비스가 삽입물이 발생하자마자 알기를 원하며 데이터베이스 성능을 죽이고 싶지 않다는 것입니다.

약간의 연구를 수행하면 CLR 방아쇠를 쓰면 일을 할 수 있습니다. 삽입이 발생하면 발사되는 C#에 트리거를 작성한 다음 새로 삽입 된 데이터를 Windows 또는 WCF 서비스로 보낼 수 있습니다.

SQL CLR 트리거의 좋은 (또는 가능한) 사용은 무엇이라고 생각하십니까?

이것을 달성하는 방법에 대한 다른 아이디어가 있습니까?

도움이 되었습니까?

해결책

아마도 삽입에서 후 처리를 제거해야 할 것입니다.

삽입 트리거에서 레코드의 PK를 큐 테이블에 추가하십시오.

별도의 서비스에서 큐 테이블에서 읽고 복잡한 작업을 수행하십시오. 완료되면 레코드를 처리 된 것으로 표시하거나 (오류/상태 정보와 함께) 큐에서 레코드를 삭제하십시오.

다른 팁

당신이 설명하는 것은 때때로 작업 대기열 또는 메시지 대기열이라고합니다. 검색을 통해 찾을 수있는 DBMS 테이블 (및 기타 기술)을 사용하는 데는 몇 가지 스레드가 있습니다.

어쨌든 문제를 해결하기가 쉬운 데이터베이스 기능을 부적절하게 사용하는 것으로 방아쇠를 사용 하여이 작업을 수행하는 것을 고려할 것입니다. 트리거는 저지대 DBMS 구조적 기능 (예 : 세밀한 참조 무결성 검사)에 가장 잘 사용되며 가볍고 동기식이어야합니다. 할 수는 있지만 아마도 좋은 생각은 아닐 것입니다.

나는 테이블에 트리거가 SQL Server Service Broker, 그런 다음 (비동기 적으로) 다른 스레드에서 모든 작업을 수행하는 CLR 저장 절차를 실행합니다.

매 순간 데이터베이스를 폴링하는 서비스가 있으며, 이는 많은 성능 문제를 일으키지 않으며 깨끗한 솔루션입니다. 또한 서비스 또는 기타 WCF 엔드 포인트가 없으면 트리거가 실패하거나 손실되며 나중에 여론 조사를해야합니다.

CLR 트리거 또는이를 위해 어떤 종류의 트리거를 사용하지 않는 것이 좋습니다. 당신은 심각한 유지 가능성과 잠재적 잠금 문제를 겪게 될 것입니다. (inserts 후 @@ Identity를 신경 쓰지 않으면 감사/큐 테이블을 잠그지 않으면 감사/대기열 테이블에 담그는 매우 간단한 트리거가 허용 될 수 있습니다).

대신, 애플리케이션/orm에서 큐 테이블에 물건을 삽입 하고이 대기열을 정기적으로 처리해야합니다. 이것은 ORM에서 거래를하거나 저장된 Proc를 시작함으로써 수행 될 수 있습니다. 트랜잭션은 변경 사항과 감사/대기열이 원자 적으로 유발합니다. (여기서 잠금에 조심하십시오)

즉각적인 조치가 필요한 경우, 테이블에서 삽입/업데이트/삭제를 수행 한 후 대기열을 지우기 위해 작업 산란을보고

또한 백그라운드 프로세스가 제대로 시작되지 않은 경우 1 분에 한 번 정도 큐를 두 번 확인하십시오. 웹 앱이고 스레드가 발생하지 않으려면 배경 프로세스와 통신하여 대기열을 지울 수 있습니다.

저장된 절차에서 삽입을 구현하고 삽입 후 절차에서 비즈니스 로직을 수행하지 않겠습니까? T-SQL로 쓸 수 없어서 그것에 대해 그렇게 복잡한 것은 무엇입니까?

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