请注意,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
表。并且在更新的情况下都是这两个表。
编辑 Examplee触发后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
如果UpdateUserCreditsLeft
的PrimaryKey的比用户名以外的东西,使用的FULL OUTER JOIN代替。
它也*错误,因为这些表中可能有多行,所以试图读取一个值到一个变量会给你那些行的值之一(哪一个是未定义的)。 – 2011-12-14 14:21:20
除了编写一个认为只有一行将被改变的三角架,这是一个糟糕的做法,您已经使用了隐式连接,这也是一个sql反模式。永远不要使用隐含的连接。现在你有一个你可能不想要的交叉连接。在将隐式连接替换为更好的显式连接之后将近20年编写此类代码是不可原谅的。 – HLGEM 2011-12-14 16:28:06