Tom*_*mas 17 sql sql-server triggers
我在一个表中有触发器,并希望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
Run Code Online (Sandbox Code Playgroud)
Mat*_*lie 29
请注意,这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
Run Code Online (Sandbox Code Playgroud)
根据你想做什么,你再引用表,你有兴趣与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
Run Code Online (Sandbox Code Playgroud)
如果PrimaryKey UpdateUserCreditsLeft
不是UserID,则在FULL OUTER JOIN中使用它.
小智 26
没有updated
动态表. 只有inserted
和deleted
.在UPDATE
命令上,旧数据存储在deleted
动态表中,新值存储在inserted
动态表中.
把它想象UPDATE
成一个DELETE/INSERT
组合.