【问题标题】:After Insert Trigger....Looping插入触发器后....循环
【发布时间】:2011-11-07 16:40:23
【问题描述】:

如果我在表上创建了一个“插入后”触发器,并且在该触发器中我执行了一个 While 循环以迭代“可能”多行,那么处理负载会是什么?

最终结果是我将有 99.999% 的时间只有 1 行,但由于未来不可预测,我也希望能够处理插入的多行。

触发器型号: 1) 向表中插入信息 2) 通过存储过程(如果可能)创建特定于客户端的视图

你说什么? :)

尚未完全开发,但这是我正在寻找的设计,可能结构上不合理,但应该明白这一点。

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

再次,观察触发器的设计不一定是语法糖

【问题讨论】:

  • 触发器中的WHILE 循环是一个非常糟糕的想法,并且对您的数据库设计来说是一种代码味道。如果您的设计需要这个,那么某处出现了严重错误。
  • 是的,这是我所知道的,但似乎是处理插入多行可能性的唯一解决方案。因为我正在研究 SQL 2005 Std。
  • 如果您发布代码,那么也许有人会向您展示不同的可能性。
  • @BalamBalam - 在 SQL Server 中,每个原子操作(插入、删除、更新)触发一次触发器 - 受影响行的结果集存储在特殊的 deletedinserted 表中跨度>
  • 你可以Joininserted-table 而不是创建一个新的临时表。这应该适用于 SQL 2005 Std。没有问题。 msdn.microsoft.com/en-us/library/ms191300%28v=sql.90%29.aspx

标签: tsql stored-procedures sql-server-2005 triggers


【解决方案1】:

设计明智,阅读 cmets,我认为您不一定需要在触发器中执行此操作。我会说您应该将其作为事务中插入语句的一部分进行 - 即执行插入,然后执行您想要执行的循环(无论做什么 - 执行 dbo.sp_Create_View_Client)...

我要提到的第二件事是 dbo.sp_Create_View_Client 到底在做什么 - 它是否必须依赖于插入?意思是,如果插入工作正常并且触发器失败会发生什么?我可能会在一个事务中完成整个 SP 的插入和执行,以保持数据完整性。

【讨论】:

  • 它将创建可供新客户端使用的视图,因为我也在设置要分区的数据库。我已经绘制了分区函数和方案,现在我正在尝试设置视图。客户端之间的视图结构之间唯一不同的是它们的唯一 ID。
  • 那么,为什么不在插入过程中/之后执行此操作,而不是在触发器上?
  • 在大多数情况下,插入将发生在网站上,我想包括必要的结构重新设计。要点是我正在根据客户端 ID 在表上实现分区,因此,插入后是影响仅基于客户端及其唯一 ID 的任何内容的最接近时机。
猜你喜欢
  • 1970-01-01
  • 2015-08-17
  • 2016-01-27
  • 2016-10-13
  • 2021-03-08
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多