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

SQL Server:触发如何读取Insert,Update,Delete的值

司马宏茂
2023-03-14
问题内容

我在一个表中有触发器,并且想UserId在插入,更新或删除行时读取值。怎么做?下面的代码不起作用,出现错误UPDATED

ALTER TRIGGER [dbo].[UpdateUserCreditsLeft] 
   ON  [dbo].[Order]
   AFTER INSERT,UPDATE,DELETE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE 
    @UserId INT,

    SELECT @UserId = INSERTED.UserId FROM INSERTED, DELETED

    UPDATE dbo.[User] SET CreditsLeft = CreditsLeft - 1 WHERE Id = @UserId
END

问题答案:

请注意,其inserted, deleted含义与相同,inserted CROSS JOIN deleted并给出每一行的每种组合。我怀疑这就是你想要的。

这样的事情可能会帮助您入门…

SELECT
  CASE WHEN inserted.primaryKey IS NULL THEN 'This is a delete'
       WHEN  deleted.primaryKey IS NULL THEN 'This is an insert'
                                        ELSE 'This is an update'
  END  as Action,
  *
FROM
  inserted
FULL OUTER JOIN
  deleted
    ON inserted.primaryKey = deleted.primaryKey

然后根据您要执行的操作,使用inserted.userID或引用您感兴趣的表deleted.userID,等等。

最后,请注意inserteddeleted表, 并且可以(并且确实)包含多个记录。

如果您一次插入10条记录,该inserted表将包含所有10条记录。删除和deleted表也​​是如此。并且两个表都在更新的情况下。

编辑 示例OP编辑后触发。

ALTER TRIGGER [dbo].[UpdateUserCreditsLeft] 
  ON  [dbo].[Order]
  AFTER INSERT,UPDATE,DELETE
AS 
BEGIN

  -- SET NOCOUNT ON added to prevent extra result sets from
  -- interfering with SELECT statements.
  SET NOCOUNT ON;

  UPDATE
    User
  SET
    CreditsLeft = CASE WHEN inserted.UserID IS NULL THEN <new value for a  DELETE>
                       WHEN  deleted.UserID IS NULL THEN <new value for an INSERT>
                                                    ELSE <new value for an UPDATE>
                  END
  FROM
    User
  INNER JOIN
    (
      inserted
    FULL OUTER JOIN
      deleted
        ON inserted.UserID = deleted.UserID  -- This assumes UserID is the PK on UpdateUserCreditsLeft
    )
      ON User.UserID = COALESCE(inserted.UserID, deleted.UserID)

END

如果的PrimaryKeyUpdateUserCreditsLeft不是UserID,则在FULL OUTER JOIN中使用它。



 类似资料:
  • 本文向大家介绍MySQL触发器 Update触发Insert失败,包括了MySQL触发器 Update触发Insert失败的使用技巧和注意事项,需要的朋友参考一下 今天工作需要,想要实现将仅对状态更新的表进行历史记录显示,于是考虑在原表中建立触发器,将更新的内容同时写入另一张表 于是进行测试 执行触发器语句,报错,报错内容如下: 分析,由于访问工具HediSQL,导致无法正常创建触发器,相同语句,

  • 问题内容: 我想知道以下脚本是否可以某种方式进行优化。它确实在磁盘上写了很多东西,因为它可能删除了最新的行并重新插入它们。我正在考虑应用“在重复键更新中插入…”之类的东西,并发现了单行更新的一些可能性,但我不知道如何在的上下文中应用它。 编辑: 的架构,,,:http://pastebin.com/3tRVPPVi。 要点是更新列和中的内容。表上有一个触发器,可根据这些列设置列的值。 in是表中的

  • 问题内容: 我想以一种可为我的系统恢复的方式重命名PostgreSQL(9.6)表(使用JPA / Hibernate的Java应用程序) 在我的Java代码中,JPA实体将具有以下注释 ,数据库将具有名为的等效表。 我想将表重命名为,以便可以逐步更新数据库和Java应用程序,从而允许失败和回滚。 典型的步骤是 创建in的副本 确保两种读/写都可用(即,两种方式都复制了数据) 更新Java应用程序

  • 问题内容: 我有桌子 我想在INSERT上创建一个触发器,该触发器将更改inserting的值,例如: 将导致 在上面的示例中,我得到了插入的值,将其更改为大写并添加到末尾。 这就是我所需要的,获取要插入的内容并对其进行修改。 我怎样才能做到这一点? 插入更新后处理它是否更好?还是使用INSTEAD OF INSERT进行触发,并在表结构每次更改时对其进行修改? 问题答案: 使用插入后触发器。从伪

  • 问题内容: 我有一个包含URL和代表其参数的字符串的表。问题是我希望url和parameterstring是表的唯一约束-aka没有条目可以具有相同的url AND parameter string。参数字符串可以是任意长度(长于800bytes左右,这是MySql键的最大长度,因此我不能使用Unique(url,params),因为它会引发错误…)。 我曾考虑过使用触发器来执行此操作,但是如果触

  • 我用Datastax php-driver在我的cassandra上运行CQL。我使用插入、更新、删除操作。 下面是我为insert运行的示例代码 我的问题是,如何知道插入(或更新、删除)是否成功。我已经阅读了Datastax文档并知道$session- 非常感谢任何帮助或建议... 更新: 根据答案,工作代码示例