Tsql 插入触发器后…循环
如果我在一个表上创建了一个After Insert触发器,并且在该触发器中执行了While循环来迭代可能的多行,那么处理负载会是什么问题呢 最终的结果是,99.999%的时间我只有一行,但由于未来不可预测,我还希望能够处理插入的多行 触发模式: 1在表中插入信息 2如果可能,通过存储过程创建特定于客户端的视图 你说呢 还没有完全发展,但这是我正在寻找的设计,可能结构不健全,但应该得到跨越点Tsql 插入触发器后…循环,tsql,stored-procedures,sql-server-2005,triggers,Tsql,Stored Procedures,Sql Server 2005,Triggers,如果我在一个表上创建了一个After Insert触发器,并且在该触发器中执行了While循环来迭代可能的多行,那么处理负载会是什么问题呢 最终的结果是,99.999%的时间我只有一行,但由于未来不可预测,我还希望能够处理插入的多行 触发模式: 1在表中插入信息 2如果可能,通过存储过程创建特定于客户端的视图 你说呢 还没有完全发展,但这是我正在寻找的设计,可能结构不健全,但应该得到跨越点 CREATE TRIGGER dbo.New_Client_Setup ON dbo.clien
CREATE TRIGGER dbo.New_Client_Setup
ON dbo.client
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
--Fill Temp Table
select * into #clients
from inserted
--Iterate through Temp Table
While (select count(*) from #clients) <> 0 BEGIN
declare @id int, @clnt nvarchar(10)
select top(1)
@id = id
, @clnt = short
order by id desc
Execute dbo.sp_Create_View_Client ( @id, @clnt )
-- Drop used ID
delete from #clients
where id = @id
END
Drop table #clients
END
GO
同样,观察触发器的设计不一定是语法上的糖分,阅读注释,我认为您不必在触发器中这样做。我想说的是,您应该在事务中作为insert语句的一部分执行此操作-即,执行insert,然后执行您希望执行的循环-执行dbo.sp_Create_View_Client
我要提到的第二件事是dbo.sp\u Create\u View\u Client到底在做什么——它必须依赖于insert吗?也就是说,如果insert工作正常,而触发器失败,会发生什么?我可能会在一个事务中完成SP的整个插入和执行,以保持数据完整性。从设计角度看,阅读注释,我认为您不必在触发器中执行此操作。我想说的是,您应该在事务中作为insert语句的一部分执行此操作-即,执行insert,然后执行您希望执行的循环-执行dbo.sp_Create_View_Client
我要提到的第二件事是dbo.sp\u Create\u View\u Client到底在做什么——它必须依赖于insert吗?也就是说,如果insert工作正常,而触发器失败,会发生什么?我可能会在一个事务中完成SP的整个插入和执行,以保持数据的完整性。触发器中的WHILE循环是一个非常糟糕的想法,对于您的DB设计来说是一种代码味道。如果您的设计需要这样做,那么某个地方出现了严重的错误。是的,这是我所知道的,但似乎是处理插入多行可能性的唯一解决方案。因为我正在处理SQL 2005 Std。如果您发布代码,可能有人会向您展示一种不同的可能性。@BalamBalam-在SQL Server中,每个原子操作插入、删除、,更新-受影响行的结果集存储在特殊的删除和插入表中。您可以加入插入表,而不是创建新的临时表。这应该可以在SQL2005标准中正常工作。触发器中的WHILE循环是一个非常糟糕的想法,对于您的DB设计来说是一种代码味道。如果您的设计需要这样做,那么某个地方出现了严重的错误。是的,这是我所知道的,但似乎是处理插入多行可能性的唯一解决方案。因为我正在处理SQL 2005 Std。如果您发布代码,可能有人会向您展示一种不同的可能性。@BalamBalam-在SQL Server中,每个原子操作插入、删除、,更新-受影响行的结果集存储在特殊的删除和插入表中。您可以加入插入表,而不是创建新的临时表。这应该可以在SQL2005标准中正常工作。它将创建可用于新客户机的视图,因为我还在设置要分区的数据库。我已经绘制了配分函数和方案,现在我正在尝试设置视图。客户端之间视图结构的唯一不同之处是它们的唯一ID。那么,为什么不在插入期间/之后执行此操作,而不是在触发器上执行此操作呢?在大多数情况下,插入将发生在网站上,我希望包括必要的结构重新设计。主要的一点是,我正在基于客户机ID在表上实现一个分区,因此,在Insert之后是实现任何完全基于客户机及其唯一ID的操作的最合适时机。它将创建新客户机可用的视图,因为我也在设置要分区的数据库。我已经绘制了配分函数和方案,现在我正在尝试设置视图。客户端之间视图结构的唯一不同之处是它们的唯一ID。那么,为什么不在插入期间/之后执行此操作,而不是在触发器上执行此操作呢?在大多数情况下,插入将发生在网站上,我希望包括必要的结构重新设计。主要的一点是,我正在基于客户机ID在表上实现一个分区,因此,在Insert之后是实现完全基于客户机及其唯一ID的任何内容的最合适时机。