2009-02-24 73 views
1

我有两个触发器插入或更新后,而不是插入。看来after trigger没有运行或发送正确的数据。插入后,更新触发器没有运行

我已经验证Z_UpdateStageTable存储过程的正确操作,而是插入的触发。删除而不是插入触发器没有任何影响。插入后,更新触发器一次正常工作,我没有做任何更改。我试图删除它并添加它,但它仍然不运行或具有正确的数据。

任何想法?

而是插入的:

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 

回答

2

有没有在AFTER触发的SET部分错字?你将同样的事情分成三个不同的变量。

而不是确认的Z_UpdateStageTable的行为,我想尝试的东西污垢简单的(无参数的SQL语句,说)来代替它来测试是否被称为触发的。这可能是因为存储过程中没有被调用,你认为它被调用。

1

等一下,如果用户ID是你的PK则Z_MobileSyncFilters将尚未取得任何资料,这也是一个替代触发

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

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

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

为什么你对这个表2 INSERT触发器(1改为1后)?

+0

的应用程序(不是我)有新的数据每次连接时间。不幸的是,该应用程序不够智能执行更新,因此它试图在连接时进行插入。没有删除它只能在第一次使用。 – NitroxDM 2009-02-24 19:11:13

+0

丹尼斯是正确的第二个触发器是不正确的,如果多行插入发生,将无法正常工作。永远不要只依靠在触发器中插入/更新/删除一行。 – HLGEM 2009-02-24 19:42:55

1

您可以添加PRINT语句来触发和手动ManagementStudio /企业管理器插入,看看那里的触发失败。

我看到一个问题,当你在一个单独的语句插入多条记录,作为SELECT FROM Inserted将返回超过1分的纪录。

您也可以更新SET声明SELECT @Var = AllWos FROM Inserted

+0

SET语句的良好调用。该应用程序(不是我的)将只在时间插入一条记录。我不担心不止一行。 – NitroxDM 2009-02-24 19:04:46