트리거 에 대해 정말 알 고 있 습 니까?데이터 실시 간 동기 화 업데이트 문제 분석

우리 가 동적 표를 업데이트 하고 싶 을 때(즉,표 에 있 는 데이터 가 계속 추가 되 는 것),아마도 우 리 는 데이터 베 이 스 를 이용 하여 작업 을 한 후에 그 에 게 동적 표 에 추 가 된 데 이 터 를 정기 적 으로 조회 하고 데 이 터 를 업데이트 하 게 할 것 이다.이 럴 때 데 이 터 를 업데이트 하 라 는 요 구 를 실현 할 수 있 지만 데 이 터 는 실시 간 으로 업데이트 되 지 않 는 다.이때 트리거 는 우리 가 원 하 는 신기 이다.우 리 는 그 동적 표 에 트리거 를 새로 만 들 수 있다.트리거 의 실질 은 저장 과정 입 니 다.다만 그 가 호출 한 시간 은 만들어 진 동적 표 에 따라 이 표 가 발생 하여 실 행 됩 니 다(즉,Insert 새 데이터,Update 또는 Delete 데이터).구체 적 으로 트리거 를 어떻게 사용 하 는 지 오늘 은 소개 하지 않 겠 습 니 다.정원 에 자료 가 많 습 니 다.그럼 제 가 오늘 소개 할 게 뭐 죠?며칠 전에 sql 코드 를 쓸 때 본의 아니 게 이런 문 제 를 발 견 했 습 니 다.바로 저 는 동적 표 에 데 이 터 를 삽입 할 때마다 트리거 가 한 번 씩 실 행 될 것 이 라 고 생각 했 습 니 다.하지만 이렇게 이해 하면 데 이 터 를 대량으로 삽입 할 때 트리거 가 실 행 된 횟수 와 삽 입 된 줄 이 같 지만 사실은 그렇지 않 습 니 다.오늘 시간 이 좀 있 는 틈 을 타서 여러분 과 나 누고 싶 습 니 다.잘못 말 한 것 은 모두 가 고 쳐 주 십시오!다음은 제 가 간단 한 예 를 써 서 여러분 께 참고 하도록 하 겠 습 니 다.
 
--
Create table Table_a
(
ID int identity(1,1),-- ID
Content nvarchar(50),
UpdateIDForTrigger int
)
그리고 우 리 는 이 표 에 트리거
 
Create TRIGGER [dbo].[Table_a_Ins]
ON [dbo].[Table_a]
AFTER INSERT
AS
BEGIN
declare @ID int
set @ID=(select ID from inserted)
-- Table_a UpdateIDForTrigger ,
UPDATE Table_a
SET UpdateIDForTrigger = (@ID+10)-- , ID 10
WHERE ID = @ID;
END
을 만 들 었 습 니 다.그 다음 에 우 리 는 일반 항목 의 삽입 결과 에 따라 테스트 를 한 다음 에
 
--
insert into Table_a(Content) values(' ');
insert into Table_a(Content) values(' ');
을 한 다음 에 현재 동적 표 의 데이터 상황
 
select * from Table_a
조회 결 과 를 조회 합 니 다.그림: 우 리 는 트리거 가 실행 되 는 것 을 볼 수 있다.모든 데이터 가 삽 입 될 때 트리거 는 Update 기능 을 동시에 실행 합 니 다.그 다음 에 우 리 는 데 이 터 를 대량으로 삽입 해 야 합 니 다.우리 가 삽입 하 는 것 을 편리 하 게 하기 위해 서 우 리 는 임시 적 인 기본 정보 표를 만 들 었 습 니 다.
 
--
Create table Table_Info
(
ID int identity(1,1),
Content nvarchar(50)
)
그 다음 에 데 이 터 를
 
insert into Table_Info(Content) values(' ');
insert into Table_Info(Content) values(' ');
insert into Table_Info(Content) values(' ');
insert into Table_Info(Content) values(' ');
insert into Table_Info(Content) values(' ');
insert into Table_Info(Content) values(' ');
insert into Table_Info(Content) values(' ');
insert into Table_Info(Content) values(' ');
에 대량으로 삽입 할 수 있 습 니 다.이번 중점 은 우리 가 이 sql 문 구 를 실행 할 때 메시지 상자 에 오류 알림 이 발생 할 수 있 습 니 다. 경험 이 있 는 친구 들 은 이 오 류 는 여러 결과 가'='으로 변 수 를 부여 해서 생 긴 것 이라는 것 을 알 게 될 것 이다.즉,set@변수=(select 다 중 줄 결과 from Table)이 럴 때 궁금 합 니 다.문제 가 어디 에 있 습 니까?트리거 가 데 이 터 를 꽂 을 때마다 실행 되 지 않 습 니까?그래서 저 는 트리거 를 고 쳤 습 니 다.
 
insert into Table_a(Content)
select Content from Table_Info
다음 에 위의 대량 삽입 을 실행 해 보 겠 습 니 다.그의 inserted 표 에 존재 하 는 값 이 무엇 인지 보 겠 습 니 다.과연 예상 한 대로 inserted 표 의 결 과 는 데이터 가 아 닙 니 다. 은 잘못된 원인 을 알 고 우 리 는 조작 하기 가 간단 합 니 다.우 리 는 inserted 표 에 커서 를 만 들 수 있 습 니 다.그리고 커서 를 통 해 대량으로 삽 입 된 줄 마다 데 이 터 를 편집 합 니 다.다음은 우리 가 수정 한 트리거 코드 입 니 다.
 
Alter TRIGGER [dbo].[Table_a_Ins]
ON [dbo].[Table_a]
AFTER INSERT
AS
BEGIN
select ID from inserted;
END
다음 에 우 리 는 위의 대량 에 따라 데 이 터 를 삽입 한 다음 에 동적 표 의 결 과 를 조회 합 니 다.
 
Alter TRIGGER [dbo].[Table_a_Ins]
ON [dbo].[Table_a]
AFTER INSERT
AS
BEGIN
declare @ID int
declare cur_Insert cursor
for
select ID from inserted
open cur_Insert
fetch next from cur_Insert into @ID
while @@fetch_status=0
begin
UPDATE Table_a
SET UpdateIDForTrigger = (@ID+10)-- , ID 10
WHERE ID = @ID;
fetch next from cur_Insert into @ID
end
close cur_Insert
deallocate cur_Insert
END
이 실 행 될 때 오류 알림 이 없습니다.실행 결 과 는 다음 과 같 습 니 다.
 이렇게 하면 데 이 터 를 대량으로 삽입 할 때 트리거 도 사용 할 수 있다.그리고 몇몇 선배 들 의 조언 을 결합 해 트리거 코드 를 바 꿨 다.위의 커서 를 아래 의 방식 으로 바 꾸 었 습 니 다.
 
insert into Table_a(Content)
select Content from Table_Info;
select * from Table_a;
다음 에 몇 줄 의 데 이 터 를 대량으로 삽입 한 결과 도 가능 합 니 다.그 러 니까 배 움 은 끝 이 없 잖 아!!  요약:트리거 실행 은 Insert 작업 이나 Update,Delete 등 작업 을 수행 할 때마다 실 행 됩 니 다.대상 은 수 정 된 줄 수(즉,줄 마다 수 정 될 때 실행)가 아 닙 니 다.

좋은 웹페이지 즐겨찾기