Триггер SQL Server не распознает вставленную строку - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть простой триггер SQL Server, и по какой-то причине он не распознает INSERTED строку.

Вот код:

-- code
DROP TABLE a;
GO

CREATE TABLE a 
(
    id INT IDENTITY(1,1) PRIMARY KEY,
    v INT
)
GO

DROP TABLE a_audit;

CREATE TABLE a_audit 
(
    id INT,
    v INT,
    [updated_at] [DATETIME] NOT NULL DEFAULT GETDATE()
)
GO

CREATE TRIGGER [dbo].[trg_a]
ON [dbo].[a]
AFTER INSERT, UPDATE, DELETE
NOT FOR REPLICATION
AS
BEGIN
    SET NOCOUNT ON;
    PRINT 'start';

    DECLARE @xmltmp xml = (SELECT * FROM inserted FOR XML AUTO);
    PRINT CONVERT(NVARCHAR(MAX), @xmltmp);

    -- INSERT INTO a_audit (id, v) VALUES (inserted.id, inserted.v);
END;
GO

INSERT INTO a (v) 
VALUES (1);

WAITFOR DELAY '00:00:01.11';

INSERT INTO a (v) 
VALUES (2);
GO

SELECT * FROM a;

PRINT 'done'

Он производит этот вывод

start
<inserted id="1" v="1"/>

(1 row affected)
start
<inserted id="2" v="2"/>

(1 row affected)

(2 rows affected)
done

Итак, я вижу, что строка INSERTED существует.

Однако, если я удалю комментарий к операторам insert , получится следующее:

Msg 4104, Уровень 16, Состояние 1, Процедура trg_a, Строка 14 [Строка пакетного запуска 16]
Не удалось связать многокомпонентный идентификатор "вставленный идентификатор".

Сообщение 4104, Уровень 16, Состояние 1, Процедура trg_a, строка 14 [строка запуска партии 16]
Не удалось связать многоэлементный идентификатор "вставлен. V".

Что не так?

1 Ответ

3 голосов
/ 05 ноября 2019

inserted - это таблица, а не функция. Чтобы INSERT из другой таблицы вам нужно использовать оператор INSERT INTO... SELECT ... FROM:

INSERT INTO a_audit (id,v)
SELECT id,
       v
FROM inserted;

Вы не можете ссылаться на столбцы таблицы, если не используете FROM. Например, просто выполнение приведенного ниже приведёт к ошибке ниже:

SELECT a_audit.id, a.audit.v;

Не удалось связать многоэлементный идентификатор "a_audit.id".

Вы быдолжны SELECT...FROM:

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