我如何在 SQL 服务器中创建触发器以在插入 table 后进行更新

how can I create a trigger in SQL Server to update after insert in a table

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

   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 

但是没有用,我是不是搞错了?

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

"After" 触发器适用于审核类型的操作。在另一个 table 中插入一个条目来描述刚刚发生的操作。

"Before" 触发器非常适合在数据流进入 table 之前验证并可能更改数据流。这就是你想要做的。

很遗憾,SQL 服务器没有 "Before" 触发器。但是,它确实允许 "Instead Of" 在 table 上触发。这些触发器不作为 DML 操作的一部分执行,而是在它开始之前执行。顾名思义,触发器是代替 DML 操作执行的。触发器本身必须启动操作,否则什么也不会发生。定义不执行任何操作的 "Instead Of" 触发器是呈现 table 或只读视图的好方法。

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

我在想这个,我发现了错误,我没有意识到 MAX 数字总是一个值 NULL 因为触发器将在插入 table 之后更新,(值当我插入时是 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);

谢谢你的帮助

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;

试试这个