2012-11-26 3 views
0

이전에 비슷한 질문을 게시했으나 응답 시간이 길어 보이지 않습니다! 미안하다 다시 게시해서는 안된다!SQL Server 트리거 도움말 - 동일한 테이블 업데이트

SQL Server 2008을 사용하고 있습니다. 인보이스 테이블이 있습니다.

create table INVOICE(
INVOICE_ID numeric(5) PRIMARY KEY IDENTITY, 
INVOICE_STATUS varchar(25) not null, 
TRADER_STATUS varchar (25)) 

삽입을 입력 할 때 트리거를 만들고 싶습니다. invoice_status = 'pending'- trader_status가 'open'으로 업데이트 (트리거)됩니다. 삽입이 입력되면; invoice_status = 'overdue'- trader_status가 'blocked'로 업데이트 (트리거)됩니다.

트리거 코드가 있습니다.

CREATE TRIGGER [dbo].[test] on [dbo].[invoice] 
FOR INSERT, UPDATE 
AS 
BEGIN 

SET NOCOUNT ON; 
declare @invoice_status varchar(25) 
select @invoice_status = (select invoice_status from inserted WHERE invoice_status = 'PENDING') 
insert into invoice (trader_status) values ('OPEN') 

select @invoice_status = (select invoice_status from inserted WHERE invoice_status = 'OVERDUE') 
insert into invoice (trader_status) values ('BLOCKED') 

END 
GO 

도움을 주시면 대단히 감사하겠습니다.

+0

나는 처음 시작할 때만 INSERT 트리거를 만들 것입니다 ... – curtisk

+0

'inserted '와'deleted'는 집합 연산의 결과를 나타낼 수 있도록 테이블입니다. 항상 하나의 행을 포함한다는 가정하에 트리거를 설계하는 것은 일반적으로 나쁜 계획입니다. 만약 당신이 절대적으로 확실하다면, 하나 이상의 행이 존재하지 않을 것입니다. 행 수에 대한 체크를 추가하고 나중에 받아 들일 수없는 명령문을 실행하려고 시도한 사람들에게 명시 적으로 'RaIsError'를 사용하십시오. ('(삽입 횟수를 선택하십시오.)> 1 RaIsError ('FooTable_Insert : log와 함께 하나 이상의 행을 처리 할 수 ​​없습니다', 25, 42) – HABO

답변

1
create trigger [dbo].[test] on [dbo].[invoice] 
for insert 
as 
begin 

update Invoice 
    set Trader_Status = 'OPEN' 
    where Invoice_Id in (select Invoice_Id from inserted where Invoice_Status = 'PENDING') 

update Invoice 
    set Trader_Status = 'BLOCKED' 
    where Invoice_Id in (select Invoice_Id from inserted where Invoice_Status = 'OVERDUE') 

end 

하나의 문장으로 둘 이상의 행을 삽입 할 수 있습니다.