ПОСЛЕ УДАЛЕНИЯ Trigger срабатывает, но не вставляет запись в таблицу аудита - PullRequest
0 голосов
/ 07 ноября 2018

Я использую SQL Server 2016. Ниже приведен код, который работает для действий UPDATE и INSERT. Это означает, что после того, как запись (записи) вставлена ​​или обновлена ​​в таблицу MyDB. [Dbo]. [DocumentText], соответствующая запись (записи) вставляется в [AnotherDB]. [Dbo]. [Audit]

Но тот же сценарий не работает для действия DELETE для той же таблицы. Но я вижу, что триггер срабатывает при удалении записи из таблицы MyDB. [Dbo]. [DocumentText]. При удалении одной записи результат действия DELETE выглядит следующим образом:

(затронуто 0 строк) (Затронут 1 ряд)

В то же время результаты действий UPDATE и INSERT выглядят так (с учетом одной записи):

(затронуты 1 строка) (Затронут 1 ряд)

В этой таблице не определены другие триггеры, кроме этой ...

CREATE TRIGGER [dbo].[TR_DocumentText_UPDATE_INSERT_DELETE]
   ON MyDB.[dbo].[DocumentText] AFTER INSERT, DELETE, UPDATE
   NOT FOR REPLICATION 
AS 
BEGIN
            ;WITH CTE AS (
            SELECT ISNULL(ins.DocumentID, del.DocumentID) AS DocumentID,
                CASE 
                    WHEN ins.DocumentID IS NOT NULL AND ins.DocumentID  = del.DocumentID THEN 'UPDATE' 
                    WHEN ins.DocumentID IS NOT NULL AND del.DocumentID IS NULL THEN 'INSERT'
                    ELSE 'DELETE' END AS AuditType         
                FROM inserted ins 
                FULL OUTER JOIN deleted del 
                        ON ins.DocumentID = del.DocumentID
                        )

            ,AUDIT_CTE AS (
            SELECT          
                CTE.DocumentID AS PkId, 
                'ODRT' AS Code,
                CTE.AuditType,
                'TSRE' AS MainEntityCode,
                doc.OppId AS MainEntityPkId
            FROM [MyDB].[dbo].[DocumentText] t WITH (NOLOCK)
            INNER JOIN [MyDB].[dbo].[Document] doc WITH (NOLOCK)
                        ON t.DocumentID = doc.DocumentID
            INNER JOIN CTE 
                        ON CTE.DocumentID = t.DocumentID
                            WHERE doc.OppId IS NOT NULL
                        )

            INSERT [AnotherDB].[dbo].[Audit] (Code, PKID, AuditType, MainEntityCode, MainEntityPKID)
            SELECT
                Code,
                PKID, 
                AuditType,
                MainEntityCode,
                MainEntityPkId
            FROM AUDIT_CTE;

END

1 Ответ

0 голосов
/ 07 ноября 2018

Как предложено ZLK, я должен просто удалить FROM [MyDB]. [Dbo]. [DocumentText] t WITH (NOLOCK) и напрямую запросить «FROM CTE ...». Вот и все.

...