Как запустить триггер после того, как SPROC завершил выполнение?

Я написал триггер, который отправляет электронную почту после выполнения строки INSERT.

ALTER TRIGGER TR_SendMailOnDataRequest
      ON DataRequest
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE 
        @DR_Id INT,
        @DR_FullName VARCHAR(200),
        @DR_Email VARCHAR(200),
        @DR_Phone VARCHAR(20),
        @UT_Name VARCHAR(50),
        @DR_UserTypeOther VARCHAR(50) = NULL,
        @D_Name VARCHAR(200),
        @DR_RequestDate DATETIME,
        @UF_LinkedFiles VARCHAR(MAX),
        @DRN_Names VARCHAR(200),
        @DR_Description VARCHAR(1200),
        @DR_CreatedOn DATETIME,
        @analystMailList VARCHAR(MAX),
        @tableHtml NVARCHAR(MAX),
        @downloadLink VARCHAR(MAX) = N'NONE'

    SELECT @DR_Id = MAX(DR_Id) FROM dbo.DataRequest

    SELECT 
        @DR_FullName = DR_FullName,
        @DR_Email = DR_Email,
        @DR_Phone = DR_Phone,
        @UT_Name = UT_Name,
        @DR_UserTypeOther = DR_UserTypeOther,
        @D_Name = D_Name,
        @DR_RequestDate = DR_RequestDate,
        @UF_LinkedFiles = UF_LinkedFiles,
        @DRN_Names = DRN_Names,
        @DR_Description = DR_Description,
        @DR_CreatedOn = DR_CreatedOn
    FROM
        dbo.FN_GetDataRequest(@DR_Id)

    SELECT @analystMailList = dbo.FN_GetAnalystsMailList()

    IF (LEN(@UF_LinkedFiles) > 0)
    BEGIN
        SET @downloadLink = N'<a href="http://localhost:8500/workrequest/index.cfm?event=downloads.index&id=' + CAST(@DR_Id AS VARCHAR(10)) + N'&k='+ SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('SHA', ':be9[Dcv9wF~W!?xx4JO0OXLbZ@0p4+[~z0dO|:U,OF!13^xZb')), 3, 32) + N'">Downloads</a>'
    END

    SET @tableHTML =
        N'<H1>Data Request</H1>' +
        N'<UL>' +
        N'<LI>Full Name: ' + @UF_LinkedFiles + N'</LI>' +
        N'<LI>Email: ' + @DR_Email + N'</LI>' +
        N'<LI>Phone: ' + CAST(@DR_Phone AS VARCHAR(20)) + N'</LI>' +
        N'<LI>User Type: ' + @UT_Name + N'</LI>' +
        N'<LI>User Type Other: ' + COALESCE(@DR_UserTypeOther, N'NONE') + N'</LI>' +
        N'<LI>Reuest Date: ' + CONVERT(VARCHAR(20), @DR_RequestDate, 107) + N'</LI>' +
        N'<LI>Downloads: ' + @downloadLink + N'</LI>' +
        N'</UL>';

    BEGIN
        EXEC msdb.dbo.sp_send_dbmail 
            @profile_name = 'Example',
            @recipients = 'John Doe<jdoe@example>',
            --@recipients = @analystMailList,
            @reply_to = @DR_Email,
            @subject = 'Email Test',
            @body_format = 'HTML',
            @body = @tableHtml
    END
END
GO

Вышеуказанный триггер срабатывает при выполнении операции ROW INSERT для таблицы DataRequest. После операции вставки строки я беру элемент IDENTITY, сгенерированный после операции INSERT, и использую его в качестве внешнего ключа, а также INSERT для других значений в другой таблице. Наконец, я использую значения из обеих таблиц и создаю электронное письмо для отправки.

Я не получал значения из других таблиц (например, @UF_LinkedFiles), поэтому я понял, что TRIGGER запускается сразу после INSERT в таблице FIRST, но до INSERT в таблице SECOND, поэтому при отправке EMAIL значения недоступны.

Итак, как мне убедиться, что TRIGGER запущен только после того, как SPROC, который выполняет все операции INSERT в нескольких таблицах, завершил транзакцию.

Вот схема таблицы - таблицы

2 ответа

Решение

Вместо того, чтобы использовать триггер, я включил код EMAIL SENDING в SPROC, куда вставляются строки.

Не уверен, что это ваш случай, потому что вы не объясняете, как поведение между таблицами. Но у меня был сценарий, где я пытаюсь выполнить SELECT во время серии вставки, и я не мог найти строку, потому что транзакция еще не была завершена.

Я создал дополнительную таблицу

tblProgress
    id integer,
    fieldA integer,
    fieldB integer,
    fieldC integer

Таким образом, если у вас есть 3 таблицы TableA, TableB и TableC, каждая таблица будет иметь одну INSERT триггер и сделает некоторую работу, а затем получить доступ к tblProgress.

TableA создает строки TableB и TableC update.

Тогда у tblProgress также будет AFTER UPDATE триггер, где вы проверяете все 3 поля имеют NOT NULL значение

Когда у вас есть все 3 значения, вы можете отправить электронное письмо.

Другие вопросы по тегам