如何在SQL Server中创建一个触发器,以便在插入表后进行更新

时间:2015-02-11 21:27:53

标签: sql-server tsql triggers

我创建了一个触发器,在插入后必须更新插入的表:

   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 NumFactura=@numfac+1
          where Id = (SELECT Id FROM INSERTED);

  END
  GO 

但是没有工作,我犯了错误吗?

3 个答案:

答案 0 :(得分:1)

通常不允许触发器开始单独访问其定义的同一个表。该表正好在被改变的中间(也称为变异)。

“After”触发器适用于审计类型的操作。将条目插入到不同的表中以描述刚刚发生的操作。

“之前”触发器有助于在数据流进入表之前验证并可能更改数据流。这就是你想要做的。

不幸的是,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语句,允许它更改插入的内容。

答案 1 :(得分:0)

我在想这个并且我发现了错误,我没有意识到MAX数字总是会是一个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);

谢谢你的帮助

答案 2 :(得分:-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;

试试这个