SQL Server触发器不插入行

时间:2012-02-16 15:52:43

标签: triggers sql-server-2008-r2

我使用SQL Server 2008 R2

我有一个简单的触发器

CREATE TRIGGER [dbo].[T_Personne_ITrig] ON [dbo].[Personne] FOR INSERT AS 
BEGIN
SET NOCOUNT ON 

insert into syn_HistoriquePersonne 
     (hpers_Timestamp, Supprime, ID, Nom, Prenom, Champ1, 
      Champ2, Champ3, Champ4 SiteAssocie)
 select  GETDATE(), 0, ID, Nom, Prenom, Champ1, Champ2, Champ3, 
       Champ4,  SiteAssocie
from inserted
END

它运作正常。问题是,我在一个程序中使用了一个可怕的代码库,所以我的老板不想触发表Personne上的回滚,即使它失败了。我知道这是不太可能的,但是在数据库活动量很大的情况下,他害怕超时......无论如何

所以我搜索了提交触发器。并将触发器更改为:

CREATE TRIGGER [dbo].[T_Personne_ITrig] ON [dbo].[Personne] FOR INSERT AS 
BEGIN
SET NOCOUNT ON 

COMMIT

insert into syn_HistoriquePersonne 
     (hpers_Timestamp, Supprime, ID, Nom, Prenom, Champ1, 
      Champ2, Champ3, Champ4 SiteAssocie)
select  GETDATE(), 0, ID, Nom, Prenom, Champ1, Champ2, Champ3, 
       Champ4,  SiteAssocie
from inserted
END

但触发器一直在拍摄消息

  

交易在触发器中停止,批量中止。

所以我这样做了:

CREATE TRIGGER [dbo].[T_Personne_ITrig] ON [dbo].[Personne] FOR INSERT AS 
BEGIN
SET NOCOUNT ON 

COMMIT
BEGIN TRAN
insert into syn_HistoriquePersonne 
     (hpers_Timestamp, Supprime, ID, Nom, Prenom, Champ1, 
      Champ2, Champ3, Champ4, SiteAssocie)
 select  GETDATE(), 0, ID, Nom, Prenom, Champ1, Champ2, Champ3, 
       Champ4,  SiteAssocie
 from inserted
 END

它停止了批量中止,但它似乎永远不会在我的历史表中插入任何东西......我读到了这个主题,我觉得这应该有效。但它没有......

其他人已经遇到过这个问题,我该如何解决?

我正在进行简单的插入以测试我的触发器。

1 个答案:

答案 0 :(得分:3)

不幸的是,你正在咆哮错误的树。你不能以这种方式玩交易。

如果唯一的问题是插入失败,您可以简单地对插入内容进行检查。或者只是确保桌面上的限制能够准确反映其使用情况。但是,由于您还担心导致命令超时的过程持续时间,因此不会完全覆盖您(实际上它会使得超时的可能性稍微大一些)

我能看到的唯一方法是大规模简化insert语句,并将一些东西(所有数据,或只是时间戳和id?)插入到没有约束或索引的保持表中。然后,您需要一个重复调用的服务器端进程来处理您的保存表。

由于您的案例似乎只是维护一个历史记录,也许一个选项可能就像从historyique表中删除所有约束一样简单。所有的解决方案都有点脏,但是老板的要求似乎有点不寻常;在我看来,答案应该是容量规划。

我不知道这是否符合您的真实场景,但我希望它有所帮助。