2012-11-26 39 views
0

我之前發佈了類似的問題 - 但似乎無法得到足夠長的響應!對不起,如果我不應該再次發佈!SQL服務器觸發幫助 - 相同的表更新

這是使用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 ='逾期' - trader_status被更新(觸發)爲'阻止'。

我有的觸發代碼;

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'來明確地通知那些稍後來到的人他們試圖執行一個不可接受的語句。 ('if(從插入中選擇Count(*))> 1 RaIsError('FooTable_Insert:不會超過一行可以被處理',25,42)with log') – 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 

請注意,這將處理由單個語句插入的多行。