Подзапрос триггера возвращает более 1 значения - PullRequest
0 голосов
/ 28 апреля 2018

У меня проблема с этим триггером SQL Server, я хочу обновлять информацию в таблице Devices после каждой вставки в таблицу Mindframe, но когда у меня есть 2 записи, разделенные миллисекундами, выдает ошибку, сообщающую, что возвращается более 1 значение.

Может кто-нибудь объяснить мне, почему? Или укажите на мою ошибку ...

Триггер

CREATE OR ALTER TRIGGER device_update 
ON MindFrame
FOR INSERT
AS
BEGIN
    IF @@ROWCOUNT = 0
        RETURN

    SET NOCOUNT ON;

    IF EXISTS(SELECT * FROM INSERTED)
    BEGIN
        DECLARE @dev NVARCHAR(6)
        DECLARE @lat NVARCHAR(45)
        DECLARE @lng NVARCHAR(45)
        DECLARE @bat FLOAT

        SET @dev = (SELECT  device from inserted)
        SET @lat = (SELECT latitude from inserted)
        SET @lng = (SELECT longitude from inserted)
        SET @bat = (SELECT battery from inserted)

        UPDATE Devices
        SET lat = @lat, lng = @lng, bat = @bat, last_seen = GETDATE()
        WHERE @dev = Devices.device
    END
END

1 Ответ

0 голосов
/ 28 апреля 2018

Вы используете inserted неправильно. Он может содержать несколько строк. Это должно быть обработано как таблица (или технически представление). Никогда не предполагайте, что inserted или deleted имеет только одну строку.

Триггер еще проще написать так:

BEGIN
    UPDATE d
        SET lat = i.latitude, 
            lng = i.longitude, 
            bat = i.battery,
            last_seen = GETDATE()
        FROM inserted i JOIN
             devices d
             on i.device = d.device
END;

Вам не нужно проверять, есть ли в inserted строки (если их нет, ничего не обновляется). Вам не нужно определять локальные переменные. Код короче. , , и это работает.

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