У меня есть простой триггер 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".
Что не так?