【发布时间】:2014-03-15 10:49:37
【问题描述】:
我有一个运行良好的旧版应用程序。我正在尝试创建一个触发器,以在将表中的行插入表时删除它们。问题是,一旦我启用触发器,表就不再更新。该应用程序继续运行良好,但我猜想我的触发器禁用表更新是有原因的?有人可以解释如何排除故障或可能是什么问题吗?
更新:一旦启用触发器,正如我所说的表停止更新。 IE。我可以有 2345678 的 trgtskrun_id 并且不会加载更多行。一旦我在短暂的暂停后停止触发器,行将再次开始插入,但不在下一个逻辑数字处,这意味着应该写入表的行在系统中的某个地方丢失了?当我重新启动它时,使用上面的示例,下一个数字是 2345685,因此最终删除了一些事务。很奇怪。
为了后代,这是我的触发器 -
GO
/****** Object: Trigger [dbo].[trig_trgtskrunUpdate] Script Date: 15/02/2014 11:27:49 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER TRIGGER [dbo].[trig_trgtskrunUpdate] ON [dbo].[trgtskrun]
AFTER INSERT
AS
SET NOCOUNT ON;
DECLARE @HistoryType char(1) --"I"=insert, "U"=update, "D"=delete
SET @HistoryType=NULL
IF EXISTS (SELECT * FROM INSERTED)
BEGIN
--INSERT
SET @HistoryType='I'
--handle insert or update data
INSERT INTO [Admiral_DEV].[dbo].[happycopy]
(trgtskrun_revtype, trgtskrun_revtm, trgtskrun_id, trgtskrun_payload, trgtskrun_status,
trgtskrun_crtdt, trgtskrun_rundt, trgtskrun_parent, trgtskrun_transaction, trgtskrun_expire, trgtskrun_data,
trgmst_id, tskmst_id, jobmst_id, jobrun_id, nodmst_id, nodmst_target, servicemst_id, servicemst_target,
usrmst_id)
SELECT
@HistoryType, GETDATE(), trgtskrun_id, trgtskrun_payload, trgtskrun_status,
trgtskrun_crtdt, trgtskrun_rundt, trgtskrun_parent, trgtskrun_transaction, trgtskrun_expire, trgtskrun_data,
trgmst_id, tskmst_id, jobmst_id, jobrun_id, nodmst_id, nodmst_target, servicemst_id, servicemst_target,
usrmst_id
FROM trgtskrun where trgtskrun_id = (select MAX(trgtskrun_id) from trgtskrun)
END
对于任何关于设计的问题,告诉它 FROM tablename 而不是 FROM INSERTED/DELETED 那些不允许复制这些表中存在的文本列,因此必须执行 FROM tablename。
【问题讨论】:
-
dbo.trgtskrun和[Admiral_DEV].[dbo].[trgtskrun]是同一张表吗? -
不同的表,不同的数据库。它正在创建表的副本,但添加了一些额外的列以添加一些标识。
-
我怀疑您有递归/嵌套查询。当表上的唯一区别是执行
create trigger代码的数据库时,这似乎很容易。如果您的表名与原始表不同,这种结构会更安全。 -
啊好的,我试试看。
-
没有骰子。我已将目标位置表更改为“happycopy”,触发器中的所有内容都被修改(更新)并启用,但随后源表停止更新,直到触发器再次被禁用。
标签: sql sql-server tsql triggers