我在一个表中有触发器,并且想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
,等等。
最后,请注意inserted
和deleted
是 表, 并且可以(并且确实)包含多个记录。
如果您一次插入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- 非常感谢任何帮助或建议... 更新: 根据答案,工作代码示例