2015-02-11 30 views
0

我創建了一個觸發器,插入後必須更新插入表中插入後更新:我怎麼能在SQL Server中創建一個觸發器在表

alter trigger DispararInsertFactura1 
    on FacturaCabecera 
    after insert 
    as 
    BEGIN 
    Declare @numfac int; 
    select @numfac = NumFactura 
       FROM FacturaCabecera 
       WHERE id = (SELECT max(id) from FacturaCabecera); 
      update FacturaCabecera 
     set [email protected]+1 
      where Id = (SELECT Id FROM INSERTED); 

    END 
    GO 

但不工作,難道我犯了一個錯誤?

+4

「不起作用」永遠不能很好地描述你的問題 – 2015-02-11 21:30:47

+0

它是做什麼的?你有錯誤嗎?什麼是錯誤? – Tom 2015-02-11 21:36:50

+0

當我創建觸發器時,不會給我任何錯誤,但不會在表中插入後更新字段,當我在表中插入時,我有一個爲NULL的字段,Tigger必須用@numfac +1 – daniela 2015-02-11 21:40:12

回答

0

通常不允許觸發器對其定義的同一個表單獨訪問。該表格在被改變的中間是正確的(否則被稱爲變異)。

「之後」觸發器適用於審計類型的操作。將條目插入到不同的表中以描述剛發生的操作。

「Before」觸發器適用於在數據流進入表之前進行驗證並可能更改數據流。這是你想要做的。

不幸的是,SQL Server沒有「Before」觸發器。但是,它確實允許在表格上使用「替代」觸發器。這些觸發器不是作爲DML操作的一部分執行,而是在它開始之前執行。顧名思義,觸發器就是代替DML操作執行的。觸發器本身必須啓動操作或沒有任何反應。定義一個「什麼都不做」的「代替」觸發器是以只讀方式呈現表或視圖的好方法。

alter trigger DispararInsertFactura1 
on FacturaCabecera 
instead of insert as 
    declare @numfac int; 
    select Top 1 @numfac = NumFactura 
      from FacturaCabecera 
      order by id desc; 

    insert into FacturaCabecera(..., NumFactura, ...) 
     select ..., IsNull(@numfac, 0) + 1, ... 
     from Inserted; 

請注意,觸發器本身必須執行Insert語句,以允許它改變正在插入的內容。

+0

謝謝,它的工作方式我想...但我改變了我的代碼,我首先給你看,而不是把 select @numfac = NumFactura FROM FacturaCabecera WHERE id =(SELECT max(id)from FacturaCabecera); 要得到NumFactura,我把: WHERE id =(@ id-1); 它也可以工作,但我不知道它是否正確,我更喜歡你回答 – daniela 2015-02-12 14:11:00

+0

這是一個壞主意。只需使用一個'IDENTITY' – 2016-01-01 11:03:08

0

我在想這個,我發現了錯誤,我沒有意識到最大數字總是一個NULL值,因爲觸發器會在插入表格後更新(當我插入時該值爲NULL ),所以我改變了這一點:

select @numfac = NumFactura 
       FROM Factura Cabecera 
       WHERE id = (SELECT max(id) 
       from Factura Cabecera); 

對於這一點,給我最大號第二:

SELECT @numfac = NumFactura FROM FacturaCabecera WHERE ID = (SELECT MIN(id) 
       FROM (SELECT DISTINCT TOP (2) id FROM FacturaCabecera where  
       tipofactura='1' ORDER BY id DESC) T); 

感謝您幫助

-1
ALTER TRIGGER DispararInsertFactura1 
on FacturaCabecera 

INSTEAD OF INSERT AS 
DECLARE @numfac int; 
SELECT TOP 1 @numfac = NumFactura 
FROM FacturaCabecera 
ORDER BY id DESC; 

INSERT INTO FacturaCabecera(__ , NumFactura, __) 
SELECT __ , IsNull(@numfac, 0) + 1, __ 
FROM Inserted; 

試一試

相關問題