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

SQL触发器-如何获取更新的值?

朱修真
2023-03-14
问题内容

如何在SQL触发器中获取更新的记录的值-像这样:

CREATE TRIGGER TR_UpdateNew
   ON  Users
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    EXEC UpdateProfile (SELECT UserId FROM updated AS U);

END
GO

显然这是行不通的,但是您可以看到我要尝试的内容。


问题答案:

如果您 确定 只会更新一个值,则可以执行此操作…

CREATE TRIGGER TR_UpdateNew
   ON  Users
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    DECLARE @user_id INT
    SELECT
      @user_id = inserted.UserID
    FROM
      inserted
    INNER JOIN
      deleted
        ON inserted.PrimaryKey = deleted.PrimaryKey
        -- It's an update if the record is in BOTH inserted AND deleted

    EXEC UpdateProfile @user_id;

END
GO

如果可以一次更新多个值,则此代码将仅处理其中一个。(尽管不会出错。)

您可以使用游标,或者如果它是SQL Server 2008+,则可以使用表变量。

或者,更常见的是,只需将StoredProcedure代码移到触发器中。



 类似资料:
  • 问题内容: 我是SQL的新手,有人可以帮助我修复触发器问题吗? 我有这两个表(“评论”和“报价”),我想更新“评论”表,然后在“插入”,“更新”和“删除”中获取要约表中的数据。如果更新成功,我想使用ReviewId和ReviewDate更新商品表。 我正在使用Azure提供的SQL Server。 UserKey和Asin是唯一的值,所以这就是我用来链接这些表的东西。我将非常感谢您的帮助! 桌子:

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

  • 问题内容: 我有一个Maximo数据库,该数据库具有无法更改的表结构。我希望在创建或更新主电子邮件地址时将其复制到PERSON表中。以下结构描述了PERSON表和EMAIL表 PERSON表: EMAIL表: 如您所见,这两个表在PERSONID列上链接。这是我希望触发器执行的操作: 如果EMAIL表已更新或插入了新行,那么如果ISPRIMARY字段,我想将EMAILADDRESS字段复制到PER

  • 我遇到的问题是,当我使用Spring JPA持久化到带有触发器的表时。如果某个字段在插入时为NULL,则触发器将使用默认值填充该字段。 我的测试失败了,因为实体中的值仍然为NULL,而不是触发器中的更新值。我猜除了ID之外,保存不期望任何值发生变化。 我已经能够使用JdbcTemplate正确地持久化数据,但这似乎是一种倒退。 我使用的是SpringBoot 2.4.5 libs和HSqlDB 2

  • 我正在尝试弄清楚如何确定是什么导致构建从脚本化Jenkinsfile中运行。原因是我在docker容器中有一个脚本,我想在cron作业中运行它,所以当cron作业触发时,我只希望它运行容器,但当我推送更改时,我希望它检查代码、重建容器、运行静态代码分析、运行测试等。在cron运行中不需要所有这些。 我如何能得到原因?我尝试了< code > current build . get causes()

  • 问题内容: 我使用触发器来插入行,并希望使用上一个创建的ID供后续查询使用。 我该怎么办? 代码如下: 问题答案: 您是否看过LAST_INSERT_ID()?但要注意: 如果使用单个INSERT语句插入多行,则LAST_INSERT_ID()仅返回为第一个插入行生成的值。