【问题标题】:Table stops updating when trigger enabled启用触发器时表停止更新
【发布时间】: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


【解决方案1】:

除非有人能指出正确的方向,否则这有点无法回答,但对于未来的人来说,问题与源数据库或目标数据库的访问权限有关(需要让我的 DBA 进行调查)。我尝试在我拥有完全权限的数据库上使用相同的应用程序执行相同的任务,并且触发器可以正常工作,因此我对源数据库或目标数据库的许可导致了中断。

更新 - 进一步测试和验证。

TRIGGERS 和存储过程显然是作为“拥有”数据库的帐户运行的,因此一旦我在目标数据库中创建了与源数据库中存在的类似 sql 访问用户,触发器就会按设计工作。

【讨论】:

    【解决方案2】:

    您可以使用此命令禁用。

    ALTER TRIGGER TRIGGER_NAME DISABLE;
    

    您可以使用此命令启用;

    ALTER TRIGGER TRIGGER_NAME ENABLE;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      相关资源
      最近更新 更多