无论如何都要缓存可以在SQL Server数据库触发器中使用的数据

时间:2010-01-07 02:55:49

标签: sql-server triggers

我有一个具有userID列的订单表

我有一个id,name,

的用户表

我希望有一个数据库触发器,显示按名称插入,更新或删除。

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

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,  . . . 

2 个答案:

答案 0 :(得分:3)

好消息,你已经在使用缓存了!您的SELECT name FROM users WHERE id = @id将获取缓冲池缓存页面的名称。相信你,你将无法构建一个更好的调整,更高规模和更快的缓存。

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

答案 1 :(得分:0)

如何打开Change Data Capture,然后摆脱所有这些代码?

编辑添加其余内容:

实际上,如果您正在考虑使用标量函数获取用户名的可能性,那么请不要这样做。由于标量函数是程序性的问题,这真的很糟糕。你最好用以下的东西:

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中使用Change Data Capture。