Триггер обновления SQL Server - ломать вещи - PullRequest
0 голосов
/ 09 мая 2018

У меня есть утверждение UPDATE, которое, короче говоря, выполняется каждые полминуты. Это утверждение написано в Powershell, поэтому не обращайте внимания на синтаксис переменной ...

UPDATE dbo.MobileLeases 
SET IPAddress = '$($l.IPAddress)', 
    OwnerName = '$($l.OwnerName)', 
    Building = '$($l.Building)', 
    TimeOn = '$($l.Time)', 
    LeaseExpiry = '$($l.LeaseExpiry)', 
    Phone = '$($l.Phone)', 
    OwnerEmail = '$($l.OwnerEmail)' 
WHERE PhysicalAddress = '$($l.DeviceID)';

Эта часть прекрасно работает, и у меня нет проблем с обновлением этих столбцов. Он обновляет несколько строк при каждом запуске.

У меня есть триггер обновления, который я пытаюсь поставить на эту таблицу, dbo.MobileLeases. Когда столбец Building обновляется в dbo.MobileLeases, я хочу выполнить INSERT в другую таблицу, dbo.LeaseAudit.

Кажется, insert into работает для первого обновления после срабатывания триггера. После этого запланированный оператор UPDATE (от Powershell) перестает работать! Что меня смущает, но вот триггер ...

CREATE TRIGGER [dbo].[trigger_LeaseAudit] 
ON [dbo].[MobileLeases]
AFTER UPDATE 
AS
BEGIN
    SET NOCOUNT ON;

    IF UPDATE (Building)
    BEGIN
        INSERT INTO dbo.LeaseAudit(PhysicalAddress, DeviceName, OwnerName, Building, TimeOn, IPAddress)
           SELECT 
               i.PhysicalAddress, i.DeviceName, i.OwnerName, i.Building,
               i.TimeOn, i.IPAddress
           FROM
               MobileLeases AS m
           INNER JOIN 
               inserted AS i on m.PhysicalAddress = i.PhysicalAddress
           INNER JOIN 
               deleted AS d on m.PhysicalAddress = d.PhysicalAddress
           WHERE 
               m.Building <> d.Building
        END
END

Как видите, я пытаюсь INSERT INTO dbo.LeaseAudit, когда (Building) обновляется на dbo.MobileLeases, ГДЕ старое значение обновления (d.Building) отличается от нового значения (m.Building).

Наверное, мой самый большой вопрос - как этот триггер нарушает начальный запрос на обновление? Когда триггер установлен, оператор обновления по расписанию перестает работать. Когда я удаляю триггер, все снова работает.

Спасибо за любой совет.

1 Ответ

0 голосов
/ 09 мая 2018

Ответ заключается в том, что транзакция UPDATE в целом завершилась неудачно.

Триггер обновления, настроенный для таблицы A, предназначен для вставки новой строки в таблицу B при обновлении tableA.column1.

Оператор вставки содержит столбец, который был установлен в качестве PK для tableB. Очевидно, что оператор вставки не может вставить повторяющееся значение в столбец PK, поэтому все обновление было бомбардировкой.

Решением для меня было удалить атрибут PK из tableB.PK. Это таблица аудита, поэтому я не должен пропустить ее.

Спасибо

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