Как прочитать незафиксированные данные из другой таблицы внутри триггера - PullRequest
0 голосов
/ 25 января 2019

У меня есть 2 таблицы, Contact и ContactFunction.Они имеют отношение «один ко многим», так как в контакте может быть много функций контакта.Поэтому ContactFunction имеет ContactID в качестве внешнего ключа.Поэтому в моем веб-приложении .NetCore я могу обновить контакт и его функции на одной странице.Но на самом деле это спасение двух отдельных сущностей, названных выше.У меня есть триггер в таблице контактов, который помещает вставки / обновления / удаления в таблицу истории.Мне нужен способ также включить любые изменения ContactFunction в этот триггер тоже.Но на данном этапе кажется, что в таблице ContactFunction еще не было коммитов из-за предполагаемой связи.Можете ли вы придумать способ сделать это, кроме создания таблицы истории для обоих?

Я пытаюсь прочитать данные из таблицы ContactFunction внутри триггера таблицы контактов, но пока нет.переменная @FUNCTIONSSTRING - это место, где я пытаюсь прочитать данные из второй таблицы (ContactFunction)

USE [DI_Business_IE_EF_Development04]
GO
/****** Object:  Trigger [dbo].[ContactHistoryLog]    Script Date: 25/01/2019 09:33:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[ContactHistoryLog] ON [dbo].[Contact]
AFTER INSERT,UPDATE, DELETE
AS
BEGIN
SET NOCOUNT ON;

DECLARE @CurrentDateTime datetime2 = SYSUTCDATETIME();
DECLARE @Action varchar(10);
DECLARE @CONTACTID INT;
DECLARE @FIRSTUPDATE INT;
DECLARE @FUNCTIONSSTRING VARCHAR(250) = '';
DECLARE @INSERTEDID INT;

IF EXISTS (SELECT 1 FROM inserted)
BEGIN
  IF EXISTS (SELECT 1 FROM deleted)
  BEGIN
    SET @Action = 'UPDATE'
  END
  ELSE
  BEGIN
    SET @Action = 'INSERT'
  END
END
ELSE
BEGIN
  SET @Action = 'DELETE'
END

/* Update start times for newly updated data */
UPDATE c
SET
       StartDate = @CurrentDateTime, @CONTACTID = c.ID
FROM
    dbo.Contact c
    INNER JOIN inserted i
        ON c.Id = i.Id

SELECT @FIRSTUPDATE = COUNT(*) FROM dbo.ContactHistory WHERE ContactId = @CONTACTID

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT 
    @FUNCTIONSSTRING = @FUNCTIONSSTRING + F.Name + ','
    FROM ContactFunction CF
    JOIN [Function] F ON F.ID = CF.FunctionID
    WHERE CF.ContactID = @CONTACTID 


INSERT INTO DBO.ContactHistory(
ContactId,
CompanyID,
Title,
Forename,
Surname,
JobTitle,
ExecutiveNumber,
IsInformationProvider,
Email,
UpdatedBy,
StartDate,
EndDate,
[Action],
FunctionNames
)
SELECT
I.Id,
I.CompanyID,
I.Title,
I.Forename,
I.Surname,
I.JobTitle,
I.ExecutiveNumber,
I.IsInformationProvider,
I.Email,
I.UpdatedBy,
@CurrentDateTime,
@CurrentDateTime,
@Action,
(SELECT SUBSTRING(@FUNCTIONSSTRING, 0, LEN(@FUNCTIONSSTRING)))AS FunctionNames
FROM
       dbo.Contact c
       RIGHT JOIN inserted I
              ON c.Id = I.Id
-- if this is first update insert deleted value as well as inserted value, else just put in inserted
IF (@FIRSTUPDATE = 0)
BEGIN
INSERT INTO DBO.ContactHistory(
ContactId,
CompanyID,
Title,
Forename,
Surname,
JobTitle,
ExecutiveNumber,
IsInformationProvider,
Email,
UpdatedBy,
StartDate,
EndDate,
[Action],
FunctionNames
)
SELECT
d.Id,
d.CompanyID,
d.Title,
d.Forename,
d.Surname,
d.JobTitle,
d.ExecutiveNumber,
d.IsInformationProvider,
d.Email,
d.UpdatedBy,
d.StartDate,
ISNULL(d.StartDate,@CurrentDateTime),
'NONE',
(SELECT SUBSTRING(@FUNCTIONSSTRING, 0, LEN(@FUNCTIONSSTRING)))AS FunctionNames
FROM
       dbo.Contact c
       RIGHT JOIN deleted d
              ON c.Id = d.Id

END
END

Я ожидаю увидеть последние изменения в таблице ContactFunction, но ее там нет.Есть ли способ сделать это?

...