当前位置: 首页 > 知识库问答 >
问题:

在更新触发器中,插入和删除的记录计数是否总是相等?

申屠森
2023-03-14

我有以下代码的更新触发器:

declare @numrows  int       
select @numrows = @@rowcount

if @numrows <> 1
    return

在某些情况下,@numrows返回0,即使行计数为1。我想这是因为select重置了行数?无论如何,我要用这个来代替它:

set @numrows  = (select count(*) from inserted) 

在触发器的后面,我将使用插入的和删除的表记录。“插入”和“删除”的行数是否始终相等,还是需要分别检查它们?

共有2个答案

冯卓
2023-03-14

他们不会平等。记住,有一些很好的功能,比如MERGE,它可以在一个事务中插入/更新/删除所有内容,只需对触发器进行一次调用。

编辑:

在做了更多的测试后,我对MERGE工作方式的理解是错误的。它们将是单独的触发事件。每个操作一个插入/更新/删除。

因此,我认为插入和删除的计数相等并不意味着它们都是更新。更重要的是,如果两个表中都有任意数量的记录,则这是一个更新。因此,这将是确定它是否是更新的最快方法

IF EXISTS(SELECT TOP 1 1 FROM inserted) AND EXISTS(SELECT TOP 1 1 FROM deleted)

我很高兴合并没有像我想的那样工作,因为我的触发器(使用上面的代码)会失败。

屠和洽
2023-03-14

我不能像史蒂夫在回答中那样对合并发表评论,但如果在表上运行更新

UPDATE TableA SET Column1 = "ABC" WHERE Column1 = "DEF"

TableA上存在一个更新触发器,那么当触发器触发时,是的,每个插入的记录的计数

 类似资料:
  • 问题内容: 我有一个UPDATE触发器,它产生如下的INSERTED和DELETED表: 插入式 已删除 我想将此更新捕获到日志表中。我的Log表(对于所有表都是全局的)是这样的(然后我必须处理我的INSERTED和DELETED表): 是表的系统object_id,我在其中执行了UPDATE语句,UPDATEd列的主键的值,是我映射到每个表中每个列的自定义ID。仅当通过UPDATE更改列的数据时

  • 我有两张表“产品”和“库存”。表将包含所有产品。在库存表中,我每次都将产品的库存保存为一个新的条目。 我有两种类型的产品。“1”类型的产品将以stock作为编号,“0”类型的产品将以stock作为重量。因此,在products表中,我创建了两列“stock_weight(保持在库存表中输入的总重量)”和“pieces(保持在库存表中输入的总数量)”。 为此,我在stock表上创建了一个触发器,每当

  • 问题内容: 我有两个表,其中一个命名如下 另一个表具有以下字段: SID CID Per 如何为以下内容编写触发器: 如果表h1-h0的任何字段中发生 更新,则使用以下值更新表中的列: ((总数为1s-总数为0s / (总数1s +总数0s))/ 100 在此先感谢 我开发了一个触发器,但是它不起作用,它在第11行说了错误,您能说出什么问题吗? 问题答案: 在定义触发器之前,请确保更改定界符。另外

  • 问题内容: 当表中的 任何 列更新时,我想在历史表中插入一行。 我只是想捕获列名,旧值和新值。 我希望此触发器尽可能重用,因为我将在其他表上使用相同的概念。 我熟悉触发器以及如何捕获某一列上的更新。我特别在寻找如何编写 一个 触发器,以将一条记录插入到历史记录表中,以获取历史记录表的对应表中已更新的 任何 列。 编辑1 我已经指出 NOWHERE 在我的职位,我在寻找源代码,这样任何人耻辱,dow

  • 插入、更新和删除语句基于以开头的层次结构生成 UpdateBase . 这个 Insert 和 Update 构建基于中介的 ValuesBase . DML基础构造函数 顶级的“插入”、“更新”、“删除”构造函数。 Object Name Description delete(table[, whereclause, bind, returning, ...], **dialect_kw) 构建

  • 我创建了一个触发器,其工作原理如下: 从表中删除数据后它将此行插入位于另一个数据库存档中的表中 我使用dblink在远程数据库中插入数据,问题是创建查询太难了,尤其是表包含20列以上,我想为10个其他表创建类似的函数。 有没有其他快速的方法来确保这项任务? 这里有一个很好的例子: