SQL Триггер сервера после вставки в другую базу данных не срабатывает - PullRequest
0 голосов
/ 14 января 2020

Раньше у меня была TRIGGER в Table46, чтобы сработать после вставки, чтобы отправить сообщение на другой сервер с помощью Service Broker, который работал нормально:

  CREATE TRIGGER trgSendItemData
    ON [dbo].[Table46]
    AFTER INSERT
    AS
        DECLARE @new_event XML;
        SET @new_event = (
            SELECT    i.[046_ID] AS [id]
                    , NP.NoPart + ' ' + CONVERT(VARCHAR(3), T41.[041_No]) AS [name]
                    , DATEADD(MINUTE, -1 * i.[046_ExeTime], i.[046_DateTime]) AS [eventstart]
                    , i.[046_DateTime] AS [eventend]
                    , i.[046_IDRes] AS [resource_id]
                    , i.[046_ExeTime] AS [execution]
                    , ISNULL(MIN(T48.[048_MachTime]), 0) AS [same]
                    , ISNULL(MIN(T48_1.[048_MachTime]), 0) AS [all]
                    , i.[046_Pallet] AS [pallet]
            FROM inserted AS i
                INNER JOIN Table41 AS T41
                    ON i.[046_IDOp] = T41.[041_IDOp]
                INNER JOIN NoParts AS NP
                    ON T41.[041_IDNoPart] = NP.Autonumber
                INNER JOIN Table48 AS T48
                    ON i.[046_IDRes] = T48.[048_IDRes]
                    AND i.[046_IDOp] = T48.[048_IDOp]
                INNER JOIN Table48 AS T48_1
                    ON i.[046_IDOp] = T48_1.[048_IDOp]
            GROUP BY i.[046_ID], NP.NoPart, T41.[041_No], i.[046_MachTime], 
                    i.[046_DateTime], i.[046_IDRes], i.[046_ExeTime], i.[046_Pallet];
            FOR XML AUTO, ELEMENTS
        );

        DECLARE @ConvHandle UNIQUEIDENTIFIER;
        BEGIN TRANSACTION
            BEGIN DIALOG @ConvHandle
                FROM SERVICE SenderService
                TO SERVICE 'ReceiverService'
                ON CONTRACT STContract
                WITH ENCRYPTION = OFF;

                SEND ON CONVERSATION @ConvHandle
                    MESSAGE TYPE SenderMsg (@new_event);
        COMMIT TRANSACTION;
GO

Теперь мне нужны те же данные в таблице другой базы данных, но на том же сервере, поэтому я написал эту, которая не работает:

USE Database1
GO

CREATE TRIGGER trgSendEvent
    ON [dbo].[Table46]
    AFTER INSERT
    AS BEGIN
        SET NOCOUNT ON;

        INSERT INTO [Database2].[dbo].[Events]
           ([id]
           ,[name]
           ,[eventstart]
           ,[eventend]
           ,[resource_id]
           ,[execution]
           ,[same]
           ,[all]
           ,[pallet])
        SELECT    i.[046_ID] AS [id]
                , NP.NoPart + ' ' + CONVERT(VARCHAR(3), T41.[041_No]) AS [name]
                , DATEADD(MINUTE, -1 * i.[046_ExeTime], i.[046_DateTime]) AS [eventstart]
                , i.[046_DateTime] AS [eventend]
                , i.[046_IDRes] AS [resource_id]
                , i.[046_ExeTime] AS [execution]
                , ISNULL(MIN(T48.[048_MachTime]), 0) AS [same]
                , ISNULL(MIN(T48_1.[048_MachTime]), 0) AS [all]
                , i.[046_Pallet] AS [pallet]
        FROM inserted AS i
            INNER JOIN Table41 AS T41
                ON i.[046_IDOp] = T41.[041_IDOp]
            INNER JOIN NoParts AS NP
                ON T41.[041_IDNoPart] = NP.Autonumber
            INNER JOIN Table48 AS T48
                ON i.[046_IDRes] = T48.[048_IDRes]
                AND i.[046_IDOp] = T48.[048_IDOp]
            INNER JOIN Table48 AS T48_1
                ON i.[046_IDOp] = T48_1.[048_IDOp]
        GROUP BY i.[046_ID], NP.NoPart, T41.[041_No], i.[046_MachTime], 
                i.[046_DateTime], i.[046_IDRes], i.[046_ExeTime], i.[046_Pallet];
    END;
GO

Я знаю, что это не работает, потому что, если я вручную запускаю запрос для вставки нового строка в Table46, новая строка добавляется в Table46, но не в Database2.Events. Вот что я получаю в качестве вывода:

(1 row affected)

Должен ли я получить это дважды вместо этого?

Кроме того, Table46 постоянно получает данные, но когда триггер создается, он прекращает получать его.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...