触发器:插入的表如何工作?如何访问其行?

时间:2016-11-13 16:57:07

标签: sql sql-server tsql database-trigger

我有下表

Data --Table name
ID -- Identity column
PCode -- Postal Code

我创建了以下触发器:

CREATE TRIGGER Trig
ON Data
FOR INSERT
AS
BEGIN 

    Select * from inserted

END

并插入以下值

INSERT INTO Data VALUES (125)
INSERT INTO Data VALUES (126)
INSERT INTO Data VALUES (127)

它显示了这个:

enter image description here

但我期待这样的事情:

  • 在第一次插入之后,执行触发 - > inserted表中显示了一行。
  • 在第二次插入之后,执行触发 - > inserted表中显示了两行。
  • 在第3次插入后,执行触发 - > inserted表中显示了三行。

根据msdn.microsoft,所有插入的行都在此表中。

如何访问inserted表,以便我可以看到所有预期的行而不是单独的?

3 个答案:

答案 0 :(得分:1)

你做不到。从microsoft.com上的Use the inserted and deleted Tables文章中,您可以阅读:

  

在INSERT和UPDATE语句期间,inserted表存储受影响行的副本。

这意味着inserted表只包含当前INSERTUPDATE语句的行。

如果您确实希望查看多个此类INSERTUPDATE语句的所有行,则必须将这些行存储在您自己创建的表中。

答案 1 :(得分:0)

触发器中有2个表可用,插入和删除。表XXX上的每个更新实际上是来自XXX的删除行X,然后是表XXX中的行X的插入。因此插入触发器内部是插入内容的副本。你可以用触发器做很多事情,但触发器很危险。

例如,在性能演出中,我发现一个巨大的SP由触发器运行,我们放弃它并且数据库重新联机。或者另一个例子,如果您对审核登录执行了错误的触发操作,则可以关闭服务器。

答案 2 :(得分:0)

如TT所述,如果要查看所有插入的记录,则需要将“触发器”更改为以下内容:

CREATE TRIGGER Trig
ON Data
FOR INSERT
AS
BEGIN 

    Select * into "tablename"
    from
    (Select * from inserted) Ins

END