我使用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
它停止了批量中止,但它似乎永远不会在我的历史表中插入任何东西......我读到了这个主题,我觉得这应该有效。但它没有......
其他人已经遇到过这个问题,我该如何解决?
我正在进行简单的插入以测试我的触发器。
答案 0 :(得分:3)
不幸的是,你正在咆哮错误的树。你不能以这种方式玩交易。
如果唯一的问题是插入失败,您可以简单地对插入内容进行检查。或者只是确保桌面上的限制能够准确反映其使用情况。但是,由于您还担心导致命令超时的过程持续时间,因此不会完全覆盖您(实际上它会使得超时的可能性稍微大一些)
我能看到的唯一方法是大规模简化insert语句,并将一些东西(所有数据,或只是时间戳和id?)插入到没有约束或索引的保持表中。然后,您需要一个重复调用的服务器端进程来处理您的保存表。
由于您的案例似乎只是维护一个历史记录,也许一个选项可能就像从historyique表中删除所有约束一样简单。所有的解决方案都有点脏,但是老板的要求似乎有点不寻常;在我看来,答案应该是容量规划。
我不知道这是否符合您的真实场景,但我希望它有所帮助。