启用触发器时,表停止更新

时间:2014-02-16 03:56:57

标签: sql sql-server tsql triggers

我有一个完美的传统应用程序。我正在尝试创建一个触发器,当它们插入表中时将表中的行去掉。问题是,只要启用触发器,表就不再更新。该应用程序继续运行正常,但我猜不出有什么原因我的触发器禁止表更新?有人可以解释如何解决问题或问题是什么?

一旦触发器启用,

更新,因为我说表停止更新。 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。

2 个答案:

答案 0 :(得分:0)

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

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

TRIGGERS和Stored Procedures显然是作为“拥有”数据库的帐户运行的,所以只要我在目标数据库中创建了一个类似的sql访问用户,就像源DB中存在的那样,触发器按设计工作。

答案 1 :(得分:0)

您可以使用此命令禁用。

ALTER TRIGGER TRIGGER_NAME DISABLE;

您可以启用此命令;

ALTER TRIGGER TRIGGER_NAME ENABLE;