2011-08-31 98 views
2

如果我在表上创建了“After Insert”触发器,并且在该触发器中,我执行了一个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 

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

+2

触发器中的WHILE循环是一个非常糟糕的主意,并且是DB设计的代码异味。如果你的设计**需要**,那么某个地方的事情就会变得非常糟糕。 – JNK

+0

是的,这是我所知道的,但似乎是处理插入多行的可能性的唯一解决方案。正如我在SQL 2005标准工作。 – GoldBishop

+1

如果你发布你的代码,那么也许有人能够向你展示不同的可能性。 –

回答

0

设计智慧,阅读评论,我觉得你不neccesarily需要做到这一点的触发器。我会说你应该做它作为插入语句在交易中的一部分 - 即做插入,然后做你想做的循环(无论做什么 - 执行dbo.sp_Create_View_Client)...

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

+0

它将创建可供新客户端使用的视图,因为我还设置要分区的数据库。我已经有了分区函数和Scheme,现在我试图设置视图。客户端之间的视图结构之间唯一不同的是它们的唯一ID。 – GoldBishop

+0

那么,为什么你不在插入本身期间/之后做这个,而不是在触发器上? –

+0

大多数情况下,插入将发生在网站上,我想包括必要的结构重新设计。重点是我基于客户端ID在表格上实施分区,因此,插入后是完全基于客户端的任何事情的最接近的时机,以及它们唯一的ID。 – GoldBishop