【发布时间】:2012-02-16 15:52:43
【问题描述】:
我使用 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
它停止了批处理中止,但它似乎从未在我的历史表中插入任何内容...我阅读了有关该主题的信息,我认为这应该可以工作。但它没有......
其他人已经遇到过这个问题,我该如何解决?
我正在做简单的插入来测试我的触发器。
【问题讨论】:
-
只是不要在你的触发器中调用
ROLLBACK- 那么你应该没问题。不要在触发器中启动新事务...触发器应始终在导致其触发的操作的上下文中执行。 -
我不会在我的触发器中调用回滚,但如果发生超时,应用程序会调用。我知道 begin tran 不是最佳的,但它确实停止了错误消息。但真正的问题是为什么插入不起作用......
-
但是您在第一个代码 sn-p 下说过:它可以正常工作 - 那么问题又是什么?如果有超时 - 无论如何你都无法在触发器内做任何事情来处理......
-
我知道这可能是我老板的愚蠢要求,但他想要的是,如果触发器中发生任何错误,也就是超时,他希望 Personne 上的初始交易保持不变并且没有回滚。它从未发生过,但他想确定......
-
触发器作为触发触发器的插入的一部分发生。您不能在触发器内编写代码以将其与外部事务隔离。对不起,但我不知道如何用不同的词来表达,你找错了树,这是不可能的。如果您真的希望这两段代码是独立的,请移除触发器,并在您的应用程序调用的 sql 中放置一些“现在更新历史表”代码。然后,您可以控制放置开始和提交的位置和时间。但是你不能在一个不属于该事务的事务中包含一段代码。
标签: triggers sql-server-2008-r2