我如何在 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;
试试这个
我创建了一个触发器,在插入后必须更新 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;
试试这个