10

에 대한 저장 프로 시저,가 (적어도) 세 가지 접근 방법 : 저장 프로 시저를 통해장점과 트리거의 단점 비교는 성능을 위해 트랜잭션 데이터베이스에서 데이터를 비정규 오는 비정규

  1. 푸시 업데이트하는 정규화 된 트랜잭션 데이터 및 비정규 화 된보고/분석 데이터를 업데이트한다.

  2. 보조 테이블을 업데이트하는 트랜잭션 테이블에 트리거를 구현합니다. 이것은 거의 항상 역사를 유지할 때 취한 경로입니다.

  3. 야간 배치 프로세스로 처리를 지연 시키거나, 데이터 마트 /웨어 하우스로 ETL을 수행 할 수 있습니다.

도메인이 항상 정규화 된 데이터와 일치하는 비정규 데이터를 필요로하기 때문에의는 해당 옵션 # 3이 가능한없는이 질문의 목적을 위해 가정 해 봅시다. 오히려 자주 다루는 계층 적 집계가 이러한 예입니다.

저는 처음 두 가지 접근법을 모두 사용했는데 요즘에는 트리거 기반 접근 방식으로 기울여 왔습니다. 그러나 아직 발견하지 못한 "gotchas"가 있는지 궁금합니다. 미래에 장기적인 결정을 할 때 명심해야 할 몇 가지 아이디어를 얻을 수 있도록이 질문에 답할 가치가 있다고 생각했습니다.

여러분의 경험에 비추어 볼 때, 실시간 비정규 화 된 데이터를 유지 관리하는 특정 목적을위한 두 도구의 장단점은 무엇입니까? 어떤 상황에서 다른 것을 선택합니까? 그 이유는 무엇입니까?

(PS하십시오 "항상 저장된 프로 시저를 통해 가야 모든 업데이트가" "트리거가 너무 복잡하다"나처럼 아무 대답없는 - 질문의 맥락에 적절합니다.)

+0

은 비정규 화에 대한 구체화 된보기를 사용하는 것이 더 좋지 않습니까? – Enrique

+0

@ Enrique : 구체화 된보기는 불가사의 한 만병 통치약이 아닙니다. 실제로 구현할 수없는 모든 종류의 뷰가 있으며 (심지어 스키마 바인딩을 사용하여 만들 수도 있습니다), 가능한 경우에도 트리거와 거의 동일한 성능 특성을 갖습니다. – Aaronaught

답변

8

트리거가 어디 여러 유용 테이블의 경로를 업데이트하십시오.

우리는 저장 발동를 사용하고 약 4 경로가 (, 복사를 업데이트, 비활성화를 추가) 적어도

그것은 상관없이 트리거에 업데이트되지 우리가 삽입 한 데이터/작업을 쉽게 어떤 조치를 우리 행 수 또는 영향을받는 행 수 저장 프로 시저가 하나의 업데이트 경로 작동

은 내가 느끼는 : 당신이 코드를 반복하지 않으려면 ... 이제

, 트리거의 CATCH 올바른 예측 오류 처리를 의미/TRY가 : SQL Server에서 트리거 2000 이전에는 오류/롤백에 일괄 처리 중단이 발생했는데 이상적이지 않습니다 (가장 적게 말하십시오!). 이제는 트리거가 더 안정적입니다.

+0

내가 궁금한데 - 트리거에서 오류가 발생하면 왜 중단하고 싶지 않습니까? 방아쇠의 작업을 미완성 (또는 반제품)으로 두는 것이 괜찮은 경우가 있습니까? – Aaronaught

+3

시스템/데이터를 일관성없는 상태로 유지하려는 경우에만. 여기 배경 기사의 일부 정보는 다음과 같습니다. http://www.sommarskog.se/error_handling_2005.html –

4

트리거는 자동 부작용이며 트리거를 부작용 때문에 뭔가를하고 싶지 않을 때 줄을 물을 가능성이 거의 없습니다. 주로 시스템이 다른 외부 시스템과의 일부 XA 트랜잭션에 참여하는 것과 같은 것들. 방아쇠는 이것을 불가능하게 만듭니다. 또한 부작용 논리는 트리거 활성화기를 다시 활성화하여 활성화 할 수 있습니다. Warehouse에서 데이터를 다시 만들고 싶다면 몇 가지 절차 만 실행하고 다시 만들 수는 없습니다. 트리거를 실행하는 모든 작업을 실행해야합니다. 이것은 악몽입니다. INSERT, UPDATES 및 DELETES는 멱등수 및 직각이어야합니다. 워크 플로를 간소화한다고 생각하는 경우에도 트리거는 불필요하게 워크 플로를 복잡하게 만듭니다.

+1

저는 저장 프로 시저 및 트리거를 사용할지 여부를 논의했습니다. 저장 프로 시저를 신속하게 결정할 수 있었지만 트리거에 문제가있었습니다. 당신은 저를 위해 그것을 해결했습니다 : 그들이 워크 플로우를 복잡하게 만드는 이유는 저에게 충분합니다. :-) – dotslash

0

이는 비즈니스 요구 사항과 데이터베이스 사용 방법에 따라 다릅니다. 예를 들어 테이블에 영향을주는 많은 응용 프로그램과 많은 가져 오기가 있다고 가정합니다 (우리는 테이블에 영향을 줄 수있는 수백 가지 항목이 있습니다). 모든 가격을 10 % 업데이트하는 등의 작업을 수행하기 위해 SSMS에서 실행되는 쿼리를 작성해야 할 필요가 있다고 가정합니다. 이러한 종류의 일을 수행하면 저장 프로 시저가 실용적이지 않으므로 데이터베이스에 영향을 줄 수있는 모든 방법을 사용할 수 없습니다.

데이터 무결성 또는 많은 응용 프로그램 또는 프로세스 (가져 오기, SQL Server 작업 등)에이 데이터 변경이 필요한 경우 데이터에 영향을 줄 수 있으며 트리거에 속합니다.

데이터 변경이 가끔 필요한 경우 또는 하나의 응용 프로그램에서만 데이터가 변경되는 방식을 완전히 제어 한 경우 저장된 proc이 좋습니다.