MS SQL触发器无法识别插入的行

问题描述 投票:0回答:1

我有简单的MS SQL触发器,由于某种原因,它无法识别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

所以我看到插入行确实存在。但是,如果我删除对[[插入语句的注释,则输出为:

Msg 4104, Level 16, State 1, Procedure trg_a, Line 14 [Batch Start Line 16] The multi-part identifier "inserted.id" could not be bound. Msg 4104, Level 16, State 1, Procedure trg_a, Line 14 [Batch Start Line 16] The multi-part identifier "inserted.v" could not be bound. (1 row affected) (1 row affected) (2 rows affected) done
怎么了?
sql-server triggers
1个回答
0
投票
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;

© www.soinside.com 2019 - 2024. All rights reserved.