Я использую 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