当前位置: 首页 > 面试题库 >

如何检查INSTEAD OF UPDATE触发器中是否正在更新列

柯乐童
2023-03-14
问题内容

我对基于SQL Server 2000的旧应用程序进行了一些调整,不用说,我只想做绝对最小的操作,以免它可能会崩溃。

我有一个很大的用户表tbUsers,带有IsDeleted的BIT标志。我想将所有当前和将来的IsDeleted =
1个用户记录归档到我的归档表tbDeletedUsers中。

移动当前已删除的用户很简单,但是我想要一种方法来移动设置了IsDeleted标志的所有将来的用户。我可以在列上使用标准的AFTER触发器,但是我打算向tbUser表添加一些违反此约束的约束,我想让INSTEAD
OF UPDATE触发器触发并将记录移至存档表吗?

我想我的问题是…是否有可能在更新单个列时触发INSTEAD OF UPDATE触发器?这是我到目前为止的内容:

 CREATE TRIGGER trg_ArchiveUsers
 INSTEAD OF UPDATE ON tbUsers
 AS 
    BEGIN
      ...
    END
 GO

如果是这样的话(一个兼容SQL 2000的示例)将不胜感激!


问题答案:

使用测试,您可以检查 触发特定的列是否被更新(再采取具体行动),但你不能有一个触发 火灾
仅在特定列的更新。无论更新的目标是哪一列,它都会在执行更新后立即触发。UPDATE( _columnname_ )

因此,如果您认为必须使用INSTEAD OF UPDATE触发器,则需要在其中实现两种动作:

1)在更新时(或更确切地说,更新 设置为)插入到tbDeletedUsers+从中删除;tbUsers``IsDeleted __1

2)tbUsers正常更新-IsDeleted未更新(​​或已更新但未设置为1)的时间。

因为可以用一条UPDATE指令更新多个行,所以您可能还需要考虑到某些行可能已IsDeleted设置为,1而另一些行未设置为。

我不是INSTEAD OF触发器的忠实拥护者,但是如果我真的必须使用触发器来执行像您这样的任务,那么我可能会省略UPDATE()测试并实现触发器,如下所示:

CREATE TRIGGER trg_ArchiveUsers
ON tbUsers
INSTEAD OF UPDATE
AS
BEGIN
  UPDATE tbUsers
  SET
    _column_ = INSERTED. _column_ ,
    鈥�
  FROM INSERTED
  WHERE INSERTED. _key_ = tbUsers. _key_
    AND INSERTED.IsDeleted = 0
  ;
  DELETE FROM tbUsers
  FROM INSERTED
  WHERE INSERTED. _key_ = tbUsers. _key_
    AND INSERTED.IsDeleted = 1
  ;
  INSERT INTO tbDeletedUsers ( _columns_ )
  SELECT _columns_
  FROM INSERTED
  WHERE IsDeleted = 1
  ;
END


 类似资料:
  • 问题内容: 我想验证将触发器添加到某些表的数据库迁移的正确性。我正在使用sqitch,因此我想找到一种使用SQL查询进行检查的方法。我相信postgres系统表应该有可能,但是我目前找不到实现此目的的方法。 问题答案: 使用目录pg_trigger。 一个简单的表查询: 使用得到触发功能的来源: 函数用法示例: 在Sqitch脚本中,您可以使用匿名代码块,例如:

  • 问题内容: 我有一个postgres数据库,其中包含几个要监视其更新的表,并且如果有任何更新,则要触发“嘿,某些更改”更新。这在基本情况下有效,但是现在是时候进行改进了。 效果很好。我将其附着在桌子上,如下所示: (作为一个附带的问题:如果有比触发函数中的mess’o’$$更好/更容易的方法来对触发结果进行json.stringify的字符串化,请让我知道。平衡引号并不有趣)。 我要执行的操作是将

  • 问题内容: 我有一个附加到事件的处理程序,我希望它仅在由人触发而不是由trigger()方法触发时执行。我该如何区分? 例如, 问题答案: 您可以检查:如果已定义,则点击是人为的: 我在jsfiddle中的例子:

  • 问题内容: 有没有一种方法可以确定是否执行了Ajax回发,类似于我们的使用方式… …以确定是否正在执行按钮提交的回发。 我正在尝试检测来自jQuery的Ajax请求,但它也接收了我想排除的UpdatePanel请求,例如… 问题答案: 我不知道这是否会比您的解决方案更好,但是您是否尝试过?

  • userNotesTable: 用户提醒表: 插入触发器: 更新触发器: 这是数据库的当前代码,以及提醒表的特定触发器。我遇到的困难是,从提醒表中的specific中的user notes表中选择特定的名称和额外的内容,所有这些都在更新触发器中。 插入时,和会被插入到提醒和搜索表中,但我希望能够使用特定名称和用户注释表中的额外内容更新搜索表,这可能吗?

  • 问题内容: 我想知道是否正在使用我的GPU。在此过程中,可以检测是否有来自GPU的任何活动,但是我想要在脚本中编写一些东西。 有办法吗? 问题答案: 这将起作用: 这告诉我GPU正在被使用。