2015-02-11 29 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; 

试一试

相关问题