插入后,更新触发器未运行

时间:2009-02-24 18:35:10

标签: sql sql-server triggers

插入或更新后我有两个触发器,而不是插入。似乎后触发器未运行或发送正确的数据。

我已经验证了Z_UpdateStageTable存储过程和“替代插入”触发器的正确​​操作。删除而不是插入触发器没有任何影响。 After Insert,Update触发器一次正常工作,我没有对它进行任何更改。我尝试删除它并添加它,但它仍然无法运行或拥有正确的数据。

任何想法?

而不是插入:

ALTER TRIGGER [DeleteExistingFilter]
   ON  [dbo].[Z_MobileSyncFilters]
INSTEAD OF INSERT
AS 
BEGIN
SET NOCOUNT ON;
DELETE FROM Z_MobileSyncFilters WHERE UserID = (SELECT UserID FROM INSERTED);
INSERT INTO Z_MobileSyncFilters
SELECT *
FROM INSERTED;
END

插入后,更新:

TRIGGER [UpdateStageTable] 
   ON  [dbo].[Z_MobileSyncFilters]
   AFTER INSERT,UPDATE
AS 
BEGIN
SET NOCOUNT ON;
DECLARE @AllWos AS VARCHAR(5000);
DECLARE @PmWos AS VARCHAR(5000);
DECLARE @RepWos AS VARCHAR(5000);
SET @AllWos = (SELECT AllWos FROM INSERTED);
SET @RepWos = (SELECT AllWos FROM INSERTED);
SET @PmWos = (SELECT AllWos FROM INSERTED);
EXEC Z_UpdateStageTable @AllWos;
EXEC Z_UpdateStageTable @RepWos;
EXEC Z_UpdateStageTable @PmWos;
END

3 个答案:

答案 0 :(得分:2)

SET触发器的AFTER部分是否有拼写错误?你在三个不同的变量中选择相同的东西。

我没有确认Z_UpdateStageTable的行为,而是尝试用简单的东西(无参数的sql语句,例如)替换它来测试触发器是否被调用。可能没有用您认为的调用方式来调用sproc。

答案 1 :(得分:1)

等一下,如果用户ID是你的PK,那么Z_MobileSyncFilters还没有数据,这也是一个而不是触发器

这个wholw块没有做任何事情,你为什么需要这个触发器?

DELETE FROM Z_MobileSyncFilters WHERE UserID = (SELECT UserID FROM INSERTED);
INSERT INTO Z_MobileSyncFilters
SELECT *
FROM INSERTED;

你的第二个触发器是有缺陷的,因为如果你有多行操作它会失效

为什么你在这张桌子上有2个插入触发器(1个而不是1个)?

答案 2 :(得分:1)

您可以向触发器添加PRINT语句,并从ManagementStudio / Enterprise Manager手动插入以查看触发器失败的位置。

当您在单个语句中插入多个记录时,我发现问题,因为SELECT FROM Inserted将返回多于1条记录。

您还可以将SET语句更新为SELECT @Var = AllWos FROM Inserted