촉발기에 대한 사고

3248 단어
주주 학생의 블로그를 읽고 트리거에 관한 글을 보았는데 사용자가 충전할 때 treCharge 테이블에 기록을 삽입하고 t 를 업데이트합니다카드표는 데이터의 일치성을 보증합니다.우리는 당시에 특별히 많은 생각을 하지 않았는데 트리거를 생각하지 못했다. 바로 여러 개의 ql문장을 썼고 오류가 발생하지 않도록 사무나 저장 프로세스를 사용했다. 잘못 기억하지 않으면 저장 프로세스에 넣었다.그녀는 이렇게 실현했다.
 
"recharge표에서 추출한 것은 최신 충전 기록이고, 카드표에서 업데이트된 기록이 카드 번호를 충족시키는 것은 충전 카드 번호와 같다."
 
<spanstyle="font-family:FangSong_GB2312;">CREATETRIGGER[dbo].[CardCash]
  on [dbo].[T_Recharge]
  for Insert
 AS
  BEGIN
  UPDATE T_Card set sCash  =sCash +(select top 1 rAdd  fromT_Recharge order by rNo desc) WhereT_Card .cNo in (select top 1 cNo  fromT_Recharge order by rNo desc )  
  END</span>

 
텍스트 링크는 다음과 같습니다.
D층에 마이너스 감소 - 저장 프로세스와 트리거 사용
 
여기를 보고 마음속으로는 어린 사매에게 매우 탄복하지만, 나는 또 두 가지 문제가 있다.
1.sql문장은 경상입니다. 전참해도 될까요?
2. 두 개의 카드를 동시에 충전하면 검색할 수 있는 treCharge 최신 기록은 다른 카드인가요?다시 말하면 업데이트와 insert 중 어느 것이 먼저 어느 것이 뒤에 있습니까?사실 나는 두 카드를 동시에 충전할 때 도대체 어떤 기록을 먼저 삽입해야 하는지 줄곧 이해하지 못했다.
3. 만약에 2의 트리거 자체가 업무라면 모두 집행하거나 집행하지 않을 것을 보증하면 이 문제가 없다.그렇지 않으면, 사무를 더하는 것을 고려하는 것입니까?
 
이어서 촉발기의 작업 원리를 한층 더 이해했다.
테이블의 데이터를 변화시키는 작업은 삽입, 업데이트와 삭제가 있기 때문에 트리거는 세 가지로 나눌 수 있다. 그것이 바로 INSERT 트리거, UPDATE 트리거와 DELETE 트리거이다.
1. INSERT 트리거
테이블에 기록을 삽입하려고 할 때, INSERT 트리거 (있으면) 가 자동으로 실행됩니다. 이 때 시스템은 자동으로 inserted 테이블을 만들고, 새로운 기록은 트리거 테이블과 inserted 테이블에 추가됩니다.트리거는 inserted표를 검사해서 트리거 동작을 실행하는지, 트리거 동작을 어떻게 실행하는지 확인할 수 있습니다.
2. DELETE 트리거
테이블에서 정보를 삭제하려고 할 때 DELETE 트리거가 터치됩니다. 이 때 시스템은 자동으로 deleted 테이블을 만들고 삭제된 줄은 이 특수한 테이블에 놓입니다.삭제된 줄은 트리거 테이블에 더 이상 존재하지 않습니다.따라서 트리거 테이블과 deleted 테이블 사이에는 공통된 기록이 없다.
3. UPDATE 트리거
UPDATE 문은 이전 레코드를 삭제하고 새 레코드를 삽입하는 두 단계로 볼 수 있습니다.따라서 UPDATE 트리거가 터치될 때 자동으로 deleted 테이블과 inserted 테이블을 만들고 UPDATE 문장은 원시 줄을 deleted 테이블로 옮겨 업데이트 줄을 inserted 테이블에 삽입합니다.
 
여기는 insert 트리거인데 왜 트리거를 사용합니까?유사한 예로 해석하다.우리는 두 개의 표를 가지고 상품의 출고 입고 상황을 기록한다.tgood_store는 재고의 제품 종류와 수량을 기록하고 tgood_out출고된 제품의 종류와 수량을 기록합니다. 그러면 우리가 출고된 어떤 종류의 제품이 일정한 수량을 기록할 때마다 우리는 tgood_out에 이 제품의 종류와 출고 수량을 삽입하는 동시에 tgood_store에서 업데이트로 재고의 상응하는 종류의 제품의 수량을 업데이트합니다.이때 우리는 두 가지 임무를 완성해야 한다: t 삽입good_out 후 업데이트 tgood_store, 그중 하나만 조작하여 데이터의 불일치를 피하기 위해 우리는 트리거를 사용하여 tgood_out의 삽입 동작에 t 쌍을 연결합니다good_store 업데이트된 트리거.물론 이 과정은 하나의 업무가 되어야 하기 때문에 t 삽입을 걱정할 필요가 없다good_out표가 실행되었습니다. 이 동작에 연결된 트리거 동작은 실행되지 않습니다. 데이터베이스가 원자성을 설계했기 때문입니다.
 
위의 세 가지 문제를 다시 봅시다.
1. 트리거는 수정(삽입 및 삭제 포함) 시에만 트리거할 수 있으며, 다른 동작을 할 수 있는 기회를 주기 위해서이며, 데이터를 조회할 때 다른 동작을 할 수 있는 능력이 없다.트리거에 파라미터가 있는지 물어본 것은 내가 처음에 트리거의 이 특성을 이해하지 못했다는 것을 설명한다.
또한 트리거의 작업 원리에 따라 우리는 inserted와 deleted 두 개의 임시 테이블에 접근할 수 있다. 이것은 inserted가 insert와 업데이트 작업을 한 후의 데이터를 저장하는 것을 알아야 한다.deleted는 delete와 업데이트 작업을 하기 전의 데이터를 저장합니다.
Update=delete+insert.이 점은 우리에게 시사점을 준다. DRP 시스템의 한 페이지는 Item이나client 또는flowCard를 수정하는 것이다. 먼저 모두 삭제하고 삽입한 다음에 수정에 성공했다는 것을 알릴 수 있다. 그렇지 않으면 그 많은 항목을 어떻게 하나하나 판단하고modify를 할 수 있겠는가?
2. 두 개의 기록을 동시에 삽입하는 것에 관해서 어떤 사람은 괜찮다고 말한다. 왜냐하면 insert는 밀리초 레벨이기 때문이다. 그러나 어떤 레벨이든 선후가 있기 때문이다.또한, insert는rowlevel 자물쇠입니다. Lock table가 없으면 선후를 확정할 수 없습니다.
3. 저는 업무를 추가하지 않아도 된다고 생각합니다. 트리거가 insert와 업데이트 사이에 다른 조작을 허용할 수 있다면 아무런 의미가 없습니다.
 
내가 먼저 실험을 해볼게. 이 틈은 벽돌을 던져서 옥을 끌어올려도 묵묵히 겸허하게 벽돌을 받아들일 거야..

좋은 웹페이지 즐겨찾기