gpt4 book ai didi

triggers - SQL Server触发器未插入行

转载 作者:行者123 更新时间:2023-12-04 05:57:46 24 4
gpt4 key购买 nike

我使用 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

但扳机一直在射击信息

Transaction stopped in trigger, batch aborted.



所以我这样做了:
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

它停止执行中止的批处理,但它似乎从未在我的历史表中插入任何内容......我阅读了有关该主题的内容,我认为这应该可行。但它不...

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

我正在做简单的插入来测试我的触发器。

最佳答案

不幸的是,你找错了树。您不能以这种方式处理事务。

如果唯一的问题是插入失败,您可以简单地围绕插入进行检查。或者只是非常彻底地确保表上的约束准确反射(reflect)它的用途。但是,由于您还担心导致命令超时的过程持续时间,这不会完全涵盖您(实际上,它会使超时的可能性略有增加)。

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

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

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

关于triggers - SQL Server触发器未插入行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9314448/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com