2011-05-11 4 views
1

Aantal 필드가 변경되었을 때 전자 메일을 보내는 트리거를 만들었지 만 삭제되고 삽입 된 데이터가 전자 메일 본문에 저장되지 않도록하는 것이 문제입니다. 그리고 내가 삭제하고 삽입 된 여러 행이 포함되어 있기 때문에 들었다. "변경된 데이터가 포함 된 행을 가져와야합니다."해결책을 제안하십시오.데이터가 변경 될 때 전자 메일 트리거

메신저 사용하여 SQL Server 2008R2

CODE : 당신은 그 배치에 따라 화재를 유발하지 오른쪽 행마다 이해

 --DE TRIGGERT-- 
ALTER TRIGGER [dbo].[RVABestellingenAantalWijzigenTrigger] 
ON [dbo].[RVA_Bestellingen] 
AFTER UPDATE 
AS 
--Vars 
DECLARE @body varchar(500) 
DECLARE @BestellingID int 
DECLARE @CategorieID int 
DECLARE @SubCategorieID int 
DECLARE @AantalOrigineel int 
DECLARE @AantalNieuw int 
DECLARE @LocatieNaam varchar(255) 
DECLARE @ComponentNaam varchar(255) 
DECLARE @CategorieNaam varchar(255) 
DECLARE @SubCategorieNaam varchar(255) 
DECLARE @Datum datetime 

if update(Aantal) /*and (SELECT Datum FROM inserted) = cast(floor(cast(dateadd(day,1,getdate()) as float)) as datetime) */ and (convert(varchar,getdate(),108)>'11:00') 
begin 

    --Zetten aantallen 
    SET @AantalOrigineel   = (SELECT Aantal FROM deleted) 
    SET @AantalNieuw    = (SELECT Aantal FROM inserted) 
    SET @BestellingID    = (SELECT BestellingID FROM inserted) 
    SET @CategorieID    = (SELECT CategorieID FROM inserted)  
    SET @SubCategorieID    = (SELECT SubCategorieID FROM inserted) 

    --Zetten locatienaam en componentnaam 
    SELECT @LocatieNaam = ('RVA Aanpassingen Locatie: '+LocatieNaam), @ComponentNaam=OfficieleNaam, @Datum=Datum 
    FROM RVA_Bestellingen r 
    LEFT OUTER JOIN Locaties l on l.LocatieID = r.LocatieID 
    LEFT OUTER JOIN Componenten c on c.ComponentID = r.ComponentID 
    WHERE r.BestellingID = @BestellingID  


    SELECT @CategorieNaam = Categorie 
    FROM RVA_HoofdCategorie 
    WHERE HoofdCategorieID = @CategorieID 

    SELECT @SubCategorieNaam = Categorie 
    FROM dbo.RVA_SubCategorie 
    WHERE SubCategorieID = @SubCategorieID  

    --Zet boyd 
    SET @body = (
        SELECT 
         'HoofdCategorie: ' + @CategorieNaam+ char(10)+char(13) 
         +'SubCategorie: ' + @SubCategorieNaam+ char(10)+char(13) 
         + 'Componentnaam: ' 
         + @ComponentNaam + char(10)+char(13) 
         + 'Origineel aantal: ' 
         + CAST(@AantalOrigineel as varchar(50)) + char(10)+char(13) 
         + 'Nieuw aantal: ' 
         + CAST(@AantalNieuw as varchar(50)) + char(10)+char(13) 
         + 'Leverdatum: ' + 
         + convert(varchar(50),@Datum,105)      
       ) 

    --Mailen naar Adeline 
    EXEC master..xp_sendmail 
      @recipients = '[email protected]', 
      @message = @body, 
      @subject = @LocatieNaam 
end 
+0

이메일 주소를 변경하려는 경우 스팸 발송자가 이와 같은 사이트를 크롤링하여 – SQLMenace

답변

4

? 이것은 일반적으로 나쁜 생각입니다. 또한 테이블마다 분을 확인하는 작업을 쓰기, 다른 테이블에 데이터를 덤프하고있는 그

당신은 트리거가 가능한 한 빨리이 아니라 원하는 이메일을 보내 보낼 이메일

참조 : Best Practice: Coding SQL Server triggers for multi-row operations 당신은 또한을 sp_send_dbmail을하지 사용해야

(또한 나쁜 생각입니다 )

귀하의 다른 옵션은 트리거의 삭제 및 삽입 테이블을 통해 반복하고 각 행에 대해 이메일을 보내는 당신이 2008 년이기 때문에은 xp_sendmail이는

SELECT @BestellingID = BestellingID, 
     @CategorieID = CategorieID, 
     @SubCategorieID = SubCategorieID 
FROM inserted 

3을 실행하는 필요를 선택하지 그냥 1 함께 할 수있는이

SET @BestellingID    = (SELECT BestellingID FROM inserted) 
SET @CategorieID    = (SELECT CategorieID FROM inserted)  
SET @SubCategorieID    = (SELECT SubCategorieID FROM inserted) 

같은 참고

무언가로

를 더 이상 사용되지 않습니다 쿼리 ... 다중 행을 코딩해야하기 때문에 여기서는 도움이되지 않지만 1을 사용하여 여러 변수를 지정할 수 있음을 보여 주기만하면됩니다

+0

이메일을 보내 주시면 감사하겠습니다. –

0

변경된 데이터 만 가져 오는 방법은 없습니다. 여러 행을 수정할 수 있기 때문에 요청할 때 데이터를 요청할 수 있습니다. 예를 들어

, 다음 실행하면 :

UPDATE MyTable 
SET Col2 = Col2 + 1 

모든 행이 Col2의 1 씩 증가합니다. 귀하의 모범을 보인 행은 어느 것입니까?

상단에있는 변수에 값을 할당하는 선택 항목에 TOP 1 절을 사용할 수 있지만 원하는 것은 커서를 WHILE 루프 또는 커서를 사용하여 행당 이메일을 보내는 것입니다. 잠재적으로 많은 이메일이 될 것입니다.

또한 모든 업데이트가 모든 업데이트/삭제/삽입에 대해 실행되는이 이메일 절차를 보유하기 때문에 일반적으로 매우 불량합니다.

관련 문제