Sql server 是否仍然可以缓存SQL server db触发器中使用的数据

Sql server 是否仍然可以缓存SQL server db触发器中使用的数据,sql-server,triggers,Sql Server,Triggers,我有一个orders表,它有一个userID列 我有一个用户表,它的id、名称、 我想有一个数据库触发器,显示插入,更新或删除的名称 所以我不得不在每个db触发器上进行这两个表之间的连接。我认为如果我可以预先查询一个用户到ID的映射,然后在触发器上重用“查找”会更好。这可能吗 DECLARE @oldId int DECLARE @newId int DECLARE @oldName VARCHAR(100) DECLARE @newName VARCHAR(100) SELECT @oldI

我有一个orders表,它有一个userID列

我有一个用户表,它的id、名称、

我想有一个数据库触发器,显示插入,更新或删除的名称

所以我不得不在每个db触发器上进行这两个表之间的连接。我认为如果我可以预先查询一个用户到ID的映射,然后在触发器上重用“查找”会更好。这可能吗

DECLARE @oldId int
DECLARE @newId int
DECLARE @oldName VARCHAR(100)
DECLARE @newName VARCHAR(100)

SELECT @oldId = (SELECT user_id FROM Deleted)
SELECT @newId = (SELECT user_id FROM Inserted)

SELECT @oldName = (SELECT name FROM users where id = @oldId)
SELECT @newName = (SELECT name FROM users where id = @newId)

  INSERT INTO History(id,  . . . 

打开更改数据捕获,然后删除所有这些代码,怎么样

编辑以添加其余部分:

实际上,如果您正在考虑使用标量函数获取用户名的可能性,那么请不要这样做。这真的很糟糕,因为标量函数的过程性问题。你最好做些如下的事情:

INSERT dbo.History (id, ...)
SELECT i.id, ...
FROM inserted i 
JOIN deleted d    ON d.id = i.id
JOIN dbo.users u  ON u.user_id = i.user_id;

由于user_id是唯一的,并且无论何时使用它,您都有一个FK,所以它不应该是一个大问题。但是是的,你需要在每个触发器中重复这个逻辑。如果不想重复此逻辑,请在SQL 2008中使用更改数据捕获。

好消息是,您已经在使用缓存了!您的
从用户中选择名称,其中id=@id
将获取缓冲池缓存页的名称。相信我,您将无法构建比这更好、更高规模和更快的缓存


结果缓存在客户端可能是有意义的,在客户端可以完全避免到数据库的往返。或者,缓存一些复杂且长时间运行的查询结果可能很有价值。但在存储的过程/触发器中,缓存简单的索引查找结果绝对没有价值。

请记住,如果在一个事务中更新两条记录,此触发器将失败,因为“已删除”和“已插入”上的子查询将返回两条记录。因为这是2008年的一项功能,并且没有在该功能下直接实现。但OP没有指定版本,它是2010年,SP1已退出很长时间。。。所以我可以希望,不是吗?