我创建了一个触发器,在插入后必须更新插入的表:
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
但是没有工作,我犯了错误吗?
答案 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;
试试这个