2010-07-29 56 views
0
USE [ddb] 
GO 
SET ANSI_NULLS OFF 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE TRIGGER [dbo].[requeststrigger] 
ON [dbo].[requests] 
AFTER INSERT,UPDATE 
AS 
BEGIN 
DECLARE @email VARCHAR(400); 
DECLARE @firstname VARCHAR(400); 
DECLARE @requestno VARCHAR(400); 
DECLARE @lastname VARCHAR(400); 
DECLARE @statusid INT; 
DECLARE thecursor CURSOR FOR SELECT inserted.requestno,contacts.firstname,contacts.lastname,contacts.email FROM request_contacts,contacts,inserted WHERE request_contacts.requestid=inserted.requestid AND contacts.contactid=request_contacts.contactid AND request_contacts.notification=1 AND contacts.notification=1; 

SET @statusid = (SELECT statusid FROM inserted); 

IF @statusid = 4 AND @statusid <> (SELECT statusid FROM deleted) 
BEGIN 

SET NOCOUNT ON 
SET ARITHABORT ON 
OPEN thecursor; 

    FETCH NEXT FROM thecursor 
    INTO @requestno,@firstname,@lastname,@email 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 

     EXEC MAIL_SEND @email,@firstname,@requestno,@lastname; 

    FETCH NEXT FROM thecursor 
    INTO @requestno,@firstname,@lastname,@email 

    END 
CLOSE thecursor; 

DEALLOCATE thecursor 

SET NOCOUNT OFF 
END 

END 

这只是使整个UPDATE/INSERT不起作用。当我删除游标声明时,它可以工作。游标只是从名为“contacts”的同一个数据库中存在的表中选择一个字段。哪里不对?光标内触发器不工作

+0

你想要做什么? – gbn 2010-07-29 07:07:13

+0

每当TABLE1的触发器被触发时(当一行被插入/更新时),我想跳到TABLE2另一个表并获取与TABLE1中的该记录相关的所有记录(通过外键),然后遍历这些结果调用一个程序与他们做某事。 – johnshaddad 2010-07-29 07:09:56

+0

有什么想法可以帮助这个吗? – johnshaddad 2010-07-29 07:40:15

回答

2

你准备考虑修改你的设计吗?似乎你在这里尝试了一些问题。

触发器不一定是进行这种逐行操作的最佳位置,因为它与源表的更改一致,并会负面影响系统的性能。

此外,您的现有代码仅针对批处理中的单个行评估statusid,但逻辑上它可以设置为单个批次更新中的多个值。让每个操作只进行一次

更健壮的方法可能是要插入的应该产生一个MAIL_SEND操作排队表,从预定作业可以挑选行并执行MAIL_SEND行,设置一个标志。

这将简化你的触发器到插入 - 在那里不需要光标(尽管你仍然需要在某个特定的工作循环中)。