如何获取插入的表标识而不是插入触发器?

佳美

我有一个描述如下的问题:我有一个包含一个而不是插入触发器的表:

create table TMessage (ID int identity(1,1), dscp varchar(50))
GO
Alter trigger tr_tmessage on tmessage
instead of insert
as

--Set NoCount On

  insert into tmessage
  select dscp from inserted
GO
Alter proc P1
As

--Set NoCount On

insert into tmessage
(dscp)
values('some data')

Select SCOPE_IDENTITY()

GO

当我执行P1时,它将为SCOPE_IDENTITY()返回Null而不是表的标识。我什至在proc的insert语句中尝试了Output子句。但是在这种情况下,通过从Output子句中插入来填充的输出表Identity字段再次为0。

任何帮助,将不胜感激。

佐哈尔·皮莱德(Zohar Peled)

好吧,你在那里泡菜了。
一方面,您需要instead of insert表上触发器,但另一方面,您想让该触发器生成的标识返回到激活它的存储过程。

由于无法在触发器之间发送参数,因此您必须做以下三件事之一:

  1. 寻找某种方法来消除对触发器的需求。
    这是我最好的建议。

  2. 将存储过程分为两部分:一部分将执行所有操作,直到insert into语句(包括它)为止,从而激活instead of insert触发器,另一部分将执行触发器之后所需的所有操作。这样,您可以scope_identity()instead of insert触发器内部使用并将其返回值作为参数发送到第二个存储过程。
    注意:这种设计意味着您必须一个一个地插入记录。如果您尝试插入多条记录,scope_identity()则只会返回触发器插入的最后一行的标识。

  3. 寻找某种在存储过程和触发器之间传递数据的方法。由于触发器不能排除或返回参数,因此您将不得不使用临时表或常规表。此建议的解决方案仅在万不得已时才建议使用,因为这会使您的代码复杂化,并且还可能导致一些性能问题。另外,您将必须找到一种方法来保持存储过程的执行,直到触发器代替触发器完成工作为止。我可以为您提供一些有关如何在过程和触发器之间共享数据的指示,但我确实建议不要选择此解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何获取插入的表标识而不是插入触发器?

来自分类Dev

如何使用INSTEAD OF触发器获取插入到表中的新记录的标识

来自分类Dev

如何获取触发器的插入值

来自分类Dev

如何从触发器内部获取其他表中的插入ID?

来自分类Dev

多个表的代替插入触发器

来自分类Dev

数据表插入触发器

来自分类Dev

获取插入的触发器变量

来自分类Dev

使用触发器插入具有顺序标识的行

来自分类Dev

如何获取而不是触发器被触发

来自分类Dev

如何编写插入,更新触发器

来自分类Dev

如何防止尝试设置标识列的 SQL 触发器插入的记录

来自分类Dev

如何基于表中先前插入的值创建插入前触发器

来自分类Dev

如何基于表中先前插入的值创建插入前触发器

来自分类Dev

如何在插入触发器SQL Server中的变量中使用插入表?

来自分类Dev

EF4 RowCount 问题,而不是在更新其他表时插入触发器

来自分类Dev

插入的PostgreSQL触发器

来自分类Dev

插入的PostgreSQL触发器

来自分类Dev

调试插入触发器

来自分类Dev

从触发器中的表中获取非自动增量主键的最后输入值插入

来自分类Dev

PostgreSQL继承表和插入触发器

来自分类Dev

MySQL触发器:在删除表之前插入日志

来自分类Dev

使触发器停止在不同的表上插入相同的数据

来自分类Dev

MySQL触发器在插入之前更新整个表

来自分类Dev

插入触发器后更新同一表

来自分类Dev

mysql触发器在单独的表中插入字段

来自分类Dev

使用表触发器更新插入的行

来自分类Dev

插入触发器后更新同一表

来自分类Dev

Oracle触发器不允许在表上插入

来自分类Dev

创建After Insert触发器后无法插入表

Related 相关文章

热门标签

归档