Sql 触发器或存储过程
每次在表2中有新条目时,我都需要从表2.field2更新表1.field1。我创建了一个触发器,它完全可以:Sql 触发器或存储过程,sql,sql-server,triggers,procedure,Sql,Sql Server,Triggers,Procedure,每次在表2中有新条目时,我都需要从表2.field2更新表1.field1。我创建了一个触发器,它完全可以: CREATE [dbo].[insert_trg] on [dbo].[TheCat99] AFTER INSERT AS BEGIN Update therefore.dbo.thecat99 SET factura = (SELECT dbo.pedido.num_factura From dbo.Pedido
CREATE [dbo].[insert_trg]
on [dbo].[TheCat99]
AFTER INSERT AS
BEGIN
Update therefore.dbo.thecat99
SET factura = (SELECT dbo.pedido.num_factura
From dbo.Pedido
Where dbo.thecat99.pedido=dbo.pedido.num_pedido)
WHERE dbo.thecat99.pedido = ( SELECT dbo.pedido.num_pedido
FROM dbo.pedido
Where dbo.thecat99.pedido = dbo.pedido.Num_Pedido)
AND dbo.thecat99.factura is NULL
END
触发器可以工作,但还没有投入生产。我一直在读触发器的坏处和坏处,但我不知道如何使用存储过程来实现这一点。
触发是个好主意吗?如果没有,如何对存储过程执行相同的操作 触发器既不坏也不坏。它们是一个很好的工具(对于某些任务来说,是唯一的工具),但它们确实需要知识和谨慎使用,因为它们不像乍看起来那么简单 一般来说,触发器应尽可能轻且有效。 这是因为在触发器也完成之前,SQL Server不会将控制权返回给执行触发触发器的语句的人 话虽如此,您的更新代码可以这样编写(这将更高效、更可读): 但是由于您没有使用
插入的
表,这意味着每次将任何行插入到CAT99
中时,pedido
中的num_pedido
值匹配的所有行都将用于更新。还有改进的余地-使用插入的
表而不是CAT99
意味着您将只处理刚刚插入到CAT99
表中的记录,因此您的代码将更加高效:
UPDATE t
SET factura = p.num_factura
FROM inserted t
INNER JOIN dbo.Pedido p ON t.pedido= p.num_pedido
WHERE t.factura IS NULL
触发器不是坏事,也不是坏事。它们是一个很好的工具(对于某些任务来说,是唯一的工具),但它们确实需要知识和谨慎使用,因为它们不像乍看起来那么简单 一般来说,触发器应尽可能轻且有效。 这是因为在触发器也完成之前,SQL Server不会将控制权返回给执行触发触发器的语句的人 话虽如此,您的更新代码可以这样编写(这将更高效、更可读): 但是由于您没有使用
插入的
表,这意味着每次将任何行插入到CAT99
中时,pedido
中的num_pedido
值匹配的所有行都将用于更新。还有改进的余地-使用插入的
表而不是CAT99
意味着您将只处理刚刚插入到CAT99
表中的记录,因此您的代码将更加高效:
UPDATE t
SET factura = p.num_factura
FROM inserted t
INNER JOIN dbo.Pedido p ON t.pedido= p.num_pedido
WHERE t.factura IS NULL
你在哪里读到触发器是坏的和邪恶的,你有参考资料吗?使用过程时,您需要在过程中封装这两个操作,并确保没有人在过程之外修改表2。触发器并非天生邪恶。忽略插入的伪表(如此处所示)或无法解释包含0、1或多行的表的触发器通常会断开。您的触发器中当前没有任何内容可以阻止它在每次插入期间扫描两个表的全部内容,而不是仅限于插入的行。您在哪里读到触发器是坏的和邪恶的,您有引用吗?使用过程时,您需要在过程中封装这两个操作,并确保没有人在过程之外修改表2。触发器并非天生邪恶。忽略插入的伪表(如此处所示)或无法解释包含0、1或多行的表的触发器通常会断开。当前触发器中没有任何东西可以阻止它在每次插入期间扫描两个表的全部内容,而不是仅限于插入的行。